Лучше всего, если вы сможете их разделить, потому что так легче будет определить, какой из них окажется неудачным.Например, если в вашем тесте не получается купить «Sci-Fi», но успешно в «Фэнтези» и «Ужасе», как вы узнали бы, какой из них провалился?Сложная часть заключается в том, чтобы заставить ваш язык позволить вам делать это, не повторяя себя снова и снова.
Это не так проблематично для одномерных задач, как для многомерных задач, например:
GIVEN a bookstore
THAT has "Fantasy", "Sci-Fi", and "Horror" books
WHEN you only have enough money to buy one book
THEN buy "Fantasy"
и
GIVEN a bookstore
THAT has "Fantasy", "Sci-Fi", and "Horror" books
WHEN you have enough money to buy two books
THEN buy "Fantasy" and "Sci-Fi"
и
GIVEN a bookstore
THAT has "Fantasy", "Sci-Fi", and "Horror" books
WHEN you have enough money to buy two books
AND you already own a "Fantasy" book
THEN buy "Sci-Fi" and "Horror"
Мой голос в этих ситуациях по-прежнему состоит в том, что вы разделяете его следующим образом:
GIVEN a bookstore
THAT has "Fantasy", "Sci-Fi", and "Horror" books
WHEN you have enough money to buy two books
AND you already own a "Fantasy" book
THEN buy "Sci-Fi"
THEN buy "Horror"
Это означает, что у вас есть две спецификации в приведенном выше случае.Однако в статических языках, таких как C # и Java, я не нашел хорошего способа сделать это.Одна вещь, которая помогает, состоит в том, чтобы разбить ваш код аранжировки и утверждения на многократно используемые методы и выбирать из них, как если бы вы были блюда из линии кафетерия:
public virtual void Establish_context()
{
Given_a_bookstore_that_has_Fantasy_Sci_fi_and_Horror_books();
When_you_have_enough_money_to_buy_two_books();
And_you_already_own_a_fantasy_book();
}
[Specification]
public void Then_buy_Sci_fi()
{
}
[Specification]
public void Then_buy_Horror()
{
}
Теперь вы можете создавать несколько подклассов, которые смешивают и соответствуют вашимУчитывая и когда.Это уменьшает боль, но все же подчеркивает недостаток статически типизированных языков, когда речь идет о написании действительно свободного кода в стиле BDD.