рд╣рдо BDD рд╢реИрд▓реА рдореЗрдВ NUnit рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рддреЗ рд╣реИрдВ

рдПрдХ рд╢рд╛рдВрдд рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреА рд░рд╛рдд рдХреЛ, рдореИрдВрдиреЗ рд▓рд╛рдЧреВ рддрд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рджрд┐рд╡рд╕ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рд░реЙрдп рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВрдиреЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ред рдФрд░ рдЕрдЪрд╛рдирдХ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдирд╛рдо рдПрдХ рднрдпрд╛рдирдХ рд░рд╛рдХреНрд╖рд╕ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреНрд░реАрди рдкрд░ 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() { // General context setup like DateTimeProvider.Current = new Mock<DateTimeProvider>().Object; Mock.Get(DateTimeProvider.Current).Setup(m => m.GetCurrentTime()).Returns(new DateTime(2012, 10, 26)); } [Given] public void Customer_is_regular_company() { _customer= new Customer () { Name = "Jedi" }; } [And] public void Set_of_transactions_representing_monthly_usage() { _transactions = new[] { new Transaction() { Amount = 25 }, new Transaction() { Amount = 16 }, new Transaction() { Amount = 32 }, }.ToList(); } [When] public void Creating_monthly_usage_document() { _invoice = DocumentCreator.CreateMonthlyPaymentInvoice(_customer, _transactions); } [Then] public void Document_should_contain_transactions_and_not_contain_bank_fee() { var expectedInvoice = new ExpectedInvoice(); Assert.That(_invoice, Is.EqualTo(expectedInvoice)); } public override void Teardown() { DateTimeProvider.Current = new DateTimeProvider(); } } 


рдЕрдЧрд░ рдРрд╕реА рдХреЛрдИ рдмрд╛рдд рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП NuGet рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рд╣реИред

UPD: рдЧрд▓рддреА рд╕реЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦрдиреЗ рд╕реЗ, рдкрд░рд╛рдХреНрд░рдореА рдореВрд╕ рдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдореВрд▓ рд░реВрдк рд╕реЗ Fohjin.DDD.Example рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рдПрдХ рд╣реА рд╣реИред рдореИрдВ рдПрдХ рд╣реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрдИ рдЧрд┐рд╡реЗрди / рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

Source: https://habr.com/ru/post/In156325/


All Articles