我目前正在使用SpecFlow學習/測試BDD,並且它非常棒!可能在BDD中沒有一個場景嗎?
我選擇要問我的問題之前,我已經閱讀this one
,我覺得我不得不問我的問題,儘管同樣的問題,是因爲它沒有提及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();
}
我認爲留在When
方法的評論是正確的,使業務需求並不缺少任何信息,並在後面的代碼,我通過評論清楚地說明了我的意圖。
您認爲如何?任何其他的想法,爲什麼我不應該做它?
提供的答案都很棒!我現在很難選擇哪一個作爲我的問題的答案,因爲這些問題的解決方式不同,並且兩種答案都可以彼此相同。首先,我知道我想要一個錯誤,所以只需編碼'When'即可。我完全同意!其次,諸如在堆棧上推零的技術問題應該與利益相關者無關,因爲它更可能是技術問題,並且這引出了BDD和TDD之間的界限。我完全同意! –
@Alski答案確實顯示瞭如何使用SpecFlow來測試這個CustomStack,但是我仍然認爲使用BDD框架來隔離測試單個組件是過度的。 BDD通常用於描述用戶如何與系統交互;在您的示例中,用戶不會直接從堆棧中彈出某個項目,而是在應用程序中執行一個操作,該操作使用CustomStack,然後觸發堆棧彈出。因此,我認爲使用TDD和單元測試可以更好地測試CustomStack。看看Alski的想法會很有趣。 –
我完全同意,新鮮。在現實世界中,BDD代表整個系統的行爲測試。正因爲如此,嚴格說BDD,你的答案是最好的解決方案。除此之外,Alski的答案滿足了教程的需要,也就是說,能夠同時使用'When'和動作發生的地方'Then',它將在那裏與期望的值/行爲進行測試。我的困境就在於阿爾斯基的回答暗示了什麼,這解決了我的問題,實際上我們看到了BDD和TDD之間的界線,因爲事實上,這些例外不屬於BDD,而是屬於TDD。 –