Specflow中的依赖注入,是每个功能的一个上下文对象吗?

时间:2017-03-07 19:20:52

标签: c# dependency-injection bdd specflow

在Specflow中,可以使用dependency injection

在步骤定义之间共享上下文

这是否意味着您最终为每个功能提供了不同的“上下文”类?

如果是这样,这不会使跨功能共享步骤定义变得不切实际吗?你认为已经设置了字段吗?

4 个答案:

答案 0 :(得分:2)

恕我直言,您应该使用基于'域名的上下文'在您的系统中,而不是基于测试中的功能。

我们发现像这样的上下文提供了良好的关注封装,更合乎逻辑。因此,您可能有UserContextCartContextPaymentContext等,然后您需要在这些上下文中使用函数或数据的步骤在构造函数中请求它们。

正如Andreas所说,specflow将管理您的上下文,以便它们在每种情况下都是隔离的。

答案 1 :(得分:1)

  

这是否意味着你最终得到了一个不同的"背景"每个功能的课程?

我不认为情况会是这样。在编写规范时,你肯定会提到几个" kind"你的系统的一部分。我们假设我们有以下情况:

Scenario: List todo items
  Given I'm registered as user@example.com
  And I'm logged in as user@example.com
  And I add a todo item with the text 'Listen to stackoverflow podcast'
  When I list all my todo items
  Then I should see the following items
    | Text                            | Completed |
    | Listen to stackoverflow podcast | false     |

在这种情况下,我们会与系统的多个部分进行交互:

  • 注册
  • 验证
  • TodoItem creation
  • TodoItem列表

在实施此功能的步骤时,我们最终可能会得到如下组织的步骤文件:

  • AuthSteps
    • Given I'm registered as __
    • Given I'm logged in as __
  • TodoItemsSteps
    • I add a todo item with the text '__'
    • When I list all my todo items
    • Then I should see the following items

在这种情况下,使用上下文注入,我们希望分享CurrentUser的值,以便能够说出"当我列出所有我的 todo项目时#34; ,指当前用户。这样,任何其他stepFile中的任何其他步骤都可以是先前步骤的上下文。

另一方面,我不会将上下文注入与When I list all my todo items的结果一起使用,因为分享这些特定功能问题的唯一步骤将在同一个功能文件中。您可以使用then"语句"的多种变体形式,例如Then I should see n items

虽然我认为您可能有多个类使用上下文注入来共享您正在构建的服务的依赖关系,或者可能是服务本身(存储,会话等等)

答案 2 :(得分:1)

对象的生命周期是每个场景。这意味着,您可以为每个场景/测试获得一个单独的实例。

这样您就无法在不同的测试之间共享状态,因此它们不会相互影响。

答案 3 :(得分:0)

它不依赖于功能。每个场景都有自己的上下文,它将在场景结束时结束,不同的功能可以使用相同的上下文