可能有一个场景没有在BDD中?

时间:2013-12-12 21:22:40

标签: bdd specflow gherkin scenarios

我目前正在使用SpecFlow学习/测试BDD,它效果很好!

在我选择提问之前,我已经阅读了this one,我觉得我不得不问我的问题,尽管同样的问题得到解决,因为{{1}没有提及的情况。

我实际上正在测试这种情况:

Exception

我认为在Scenario: I should get an error whenever I try to remove an item from an empty stack Given I have an empty stack When I pop from it Then I should get an error public class StackBehaviour { public void GivenIHaveAnEmptyStack() { stack = new CustomStack<string>(); } // This will throw whenever called! // So the Then method will never be run! // I feel like I should just put a comment which says why it's empty, // allowing a fellow programmer to understand the exact intention. public void WhenIPopFromIt() { stack.Pop(); } // It is here that it verifies whether the CustomStack meets the expected behaviour. public void ThenIShouldGetAnError() { Assert.Throws<IndexOutOfRangeException>(delegate { stack.Pop(); }); } private CustomStack<string> stack; } public class CustomStack<T> { public T Pop() { if (stack.Count == 0) throw new IndexOutOfRangeException("Cannot pop from an empty stack!"); T item = stack[stack.Count-1]; stack.RemoveAt(stack.Count-1); return item; } private ArrayList stack = new ArrayList(); } 方法中留下评论是正确的,因此业务要求不缺少任何信息,而在后面的代码中,我通过评论明确表达了我的意图。

你怎么看?还有其他任何想法我不应该这样做吗?

2 个答案:

答案 0 :(得分:2)

你可以使用另一个技巧,绑定有助于使功能的含义更清晰一些。在这种情况下,让我们从最后开始。

Then I should get an error

你的问题基本上就在这里,你知道想要一个错误,但你不知道如何得到它。事实上,您已经错过了它,错误已经在When步骤中发生,并且在您的代码示例中,您已将操作移至then步骤,以便您可以获得错误。

但如果保持when执行操作并重新表达我们的then以反映真实情况,该怎么办

Then I should have had an error

似乎是一个微不足道的变化,但现在我们的功能反映出该错误应该与When步骤相关联,我们只是稍后对其进行评估,这是我们可以编写的代码。我们只需要记住when中的错误并将其传递给then

private Exception errorFromWhen = null;

public void WhenIPopFromIt() 
{ 
  try
  {
    stack.Pop(); 
  }
  catch(Exception ex)
  {
     errorFromWhen = ex;
  }
}

public void ThenIShouldGetAnError() 
{
   errorFromWhen.ShouldNotBeNull();
   errorFromWhen.ShouldBe<IndexOutOfRangeException>();
}

SpecFlow绝对没有问题,事实上由于它的mini Dependency injection system,你甚至可以在绑定类之间传递这种状态。

答案 1 :(得分:1)

  

一个场景可能没有在BDD中的时间吗?

在Specflow中,既不给定,也不是强制性的。

但是在你的例子中,我不相信这是一个很好的使用Specflow和BDD。在这个答案中,马库斯说:

"BDD is about ensuring that we're building the right thing, TDD is about ensuring that we're building it right."

在您的示例中,应通过TDD测试正在测试的内容即CustomStack的范围。应该通过BDD(以及因此SpecFlow)测试使用CustomStack的最终解决方案,例如如果通过网站上的某个操作行使此CustomStack。

This回答也与您的问题有关。