0

我一直在学习 BDD,在尝试了一些框架之后,我决定在我的最新项目中使用 MSpec。

在查看了一些示例后,我不确定如何识别场景和上下文。

以下面的故事为例(取自Rob Connery 的 Kona 示例):

Removing a shopping cart item
    * All items of same SKU are removed. TotalItems decremented by Quantity
    * When quantity is 0 nothing happens
    * When quantity is negative, items are removed, TotalItems stays at 0 (never negative)

这是相关的规范:

[Subject("Cart with items in it")]
public class when_removing_item : with_cart_with_1_item_of_sku1 {
    It should_remove_all_items_with_same_sku;
    It should_not_remove_anything_when_sku_not_in_cart;
    It should_not_remove_more_items_than_are_in_cart_resulting_in_negative_totalitems;
}

现在,如果我的理解是正确的:

  • 场景 => 里面有物品的购物车
  • 上下文 => 带有 1 件 sku1 的购物车
  • 规范 => 删除一个项目
  • 断言 => 应该删除所有具有相同 sku 的项目

但是,查看其他示例似乎应该这样声明:

  • 场景 => 将商品移至购物车
  • 上下文 => 当购物车中有 1 件商品时
  • 规范 => 删除一个项目
  • 断言 => 应该删除所有具有相同 sku 的项目

测试应该是:

[Subject("Removing an item from cart")]
public class when_removing_an_item_from_cart_with_items : with_cart_with_1_item_of_sku1 {
    It should_remove_all_items_with_same_sku;
    // etc.
}

我的理解是正确的,还是没有正确和错误的方法?我的假设是,主题/场景与我们正在测试的整体行为(即从购物车中移除商品)相关,并且每个规范类都在不同的上下文中测试该行为。

4

1 回答 1

2

本,我认为你给出的第二个例子更“正确”。当您考虑上下文(when类)时,请确保它包含与场景关联的所有内容。大多数情况下,只有一个“操作”(在您的示例中,删除一个项目),其规范表示在特定上下文中发生该操作后系统应处于的状态。当然可以有不同的先决条件(购物车是空的,购物车有一件物品等),这些形成不同的上下文。

只是为了澄清,删除一个项目不是观察,而是行动。

因此,我认为您可以为概述的功能编写以下规范:

[Subject("Removing item from shopping cart")]
public class when_removing_item_from_empty_cart {
  It should_be_empty;
}

[Subject("Removing item from shopping cart")]
public class when_removing_item_from_cart_with_one_item_of_another_SKU {
  It should_still_contain_the_item;
}

[Subject("Removing item from shopping cart")]
public class when_removing_item_from_cart_with_two_items {
  It should_be_empty;
}

// probably more ;-)

使用SubjectAttribute来表示功能/场景。您还可以使用TagsAttribute添加更多元数据(并可能过滤测试运行)。

我会故意选择不使用基类。根据我的经验,甚至有更好的方法来进行复杂的设置(Fluent API、Machine.Fakes 行为配置)。DRY 在这里并不真正适用:当规范失败时,您希望将属于规范的所有内容都放在您面前,而不是导航类层次结构以寻找Establish可能在其他地方徘徊的 s。

此外,您可能会发现这个示例应用程序很有趣,使用 MSpec 开发和测试。

于 2012-04-07T19:22:04.447 回答