当您编写 Given When Then 规范时,您更喜欢在 1 个 When 语句中列出集合中的元素,还是为每个单独的规范?
即
GIVEN a book WHEN category is "Fanatsy", "Sci-Fi", or "Horror" THEN Buy it.
对比
GIVEN a book WHEN category is "Fanatsy" THEN Buy it.
GIVEN a book WHEN category is "Sci-Fi" THEN Buy it.
GIVEN a book WHEN category is "Horror" THEN Buy it.
此外,您如何处理其余的集合?您是否为不在您的“即买即看”子集中的每个类别编写规范以确保它不会购买?
最佳答案
最好能将它们分开,因为这样可以更容易地确定哪一个失败了。例如,如果您的测试未能购买“Sci-Fi”,但在“Fantasy”和“Horror”上成功,您怎么知道哪一个失败了?困难的部分是哄骗您的语言,让您无需一遍又一遍地重复自己就可以做到这一点。
这在一维问题上不像在多维问题上那样有问题,例如:
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()
{
}
现在您可以创建多个子类来混合和匹配您的 Given 和 When。它减少了痛苦,但在编写真正流畅的 BDD 样式代码时仍然突出了静态类型语言的缺点。
关于testing - 在一个 Given-When-Then 语句中列出一组的所有部分,还是分解为单独的规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3497051/