
рдПрдХ рд╢рд╛рдВрдд рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреА рд░рд╛рдд рдХреЛ, рдореИрдВрдиреЗ рд▓рд╛рдЧреВ рддрд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рджрд┐рд╡рд╕ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред
рд░реЙрдп рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВрдиреЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ред рдФрд░ рдЕрдЪрд╛рдирдХ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдирд╛рдо рдПрдХ рднрдпрд╛рдирдХ рд░рд╛рдХреНрд╖рд╕ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреНрд░реАрди рдкрд░ 120 рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ред
рдФрд░ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ
рд╡реНрдпрд╡рд╣рд╛рд░-рд╡рд┐рдХрд╛рд╕ рдХреА рдзрд╛рд░рдгрд╛ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рдЖрдИ рдереА рдФрд░ рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдереЗред "Nunit bdd" рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ Google рдмрд╣реБрдд рдХрдо рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
рдЗрд╕ рдкреЛрд╕реНрдЯ рдиреЗ рдореБрдЭреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рджрд┐рдП рдЧрдП рдФрд░ рдЬрдм рддрд░реАрдХреЗ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдмрд╣реБрдд рдХрдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдпрд╣рд╛рдБ, рд╡реИрд╕реЗ, рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдмрд╣реБрдд рдирд╛рдо рд╣реИ:
CreateMonthlyPaymentInvoice_WhenCustomerIsRegularCompany_ShouldCreateMonthlyUsageInvoiceWithoutBankFeeред
рдЦреМрдлрдирд╛рдХ рд╣реИ, рд╣реИ рдирд╛?
рдореИрдВрдиреЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХрд╛рдлреА рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХрд┐рдПред рджрд┐рдП рдЧрдП, рдФрд░ рдЬрдм рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
namespace NUnit.Specification { public abstract class SpecificationBase { [TestFixtureSetUp] public void SetUp() { Setup(); Given(); When(); } public virtual void Setup() { } private void Given() { IEnumerable<MethodInfo> publicMethods = this.GetType().GetMethods(); publicMethods.Where(m => m.GetCustomAttributes(typeof(GivenAttribute), false).Count() != 0) .ToList() .ForEach(m => m.Invoke(this, new object[0])); publicMethods.Where(m => m.GetCustomAttributes(typeof(AndAttribute), false).Count() != 0) .ToList() .ForEach(m => m.Invoke(this, new object[0])); } private void When() { this.GetType() .GetMethods() .Where(m => m.GetCustomAttributes(typeof(WhenAttribute), false).Count() != 0) .ToList() .ForEach(m => m.Invoke(this, new object[0])); } [TestFixtureTearDown] public void TearDown() { Teardown(); } public virtual void Teardown() { } } public class SpecificationAttribute : TestFixtureAttribute { } public class GivenAttribute : Attribute { } public class AndAttribute : Attribute { } public class WhenAttribute : Attribute { } public class ThenAttribute : TestAttribute { } }
рдЕрдм рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рд▓рдЪреАрд▓реЗ рд╣реЛ рдЧрдП рд╣реИрдВред
[Specification] public class Create_invoice_for_regular_customer : SpecificationBase { private Customer _customer; private List<Transaction> _transactions; private Document _invoice; public override void Setup() {
рдЕрдЧрд░ рдРрд╕реА рдХреЛрдИ рдмрд╛рдд рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП NuGet рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рд╣реИред
UPD: рдЧрд▓рддреА рд╕реЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦрдиреЗ рд╕реЗ,
рдкрд░рд╛рдХреНрд░рдореА рдореВрд╕ рдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдореВрд▓ рд░реВрдк рд╕реЗ
Fohjin.DDD.Example рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рдПрдХ рд╣реА рд╣реИред рдореИрдВ рдПрдХ рд╣реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрдИ рдЧрд┐рд╡реЗрди / рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред