我目前正在使用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();
}
方法中留下评论是正确的,因此业务要求不缺少任何信息,而在后面的代码中,我通过评论明确表达了我的意图。
答案 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。在这个答案中,马库斯说:
在您的示例中,应通过TDD测试正在测试的内容即CustomStack的范围。应该通过BDD(以及因此SpecFlow)测试使用CustomStack的最终解决方案,例如如果通过网站上的某个操作行使此CustomStack。
This回答也与您的问题有关。