1

私は現在、SpecFlow を使用して 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ビジネス要件に情報が不足しないように、メソッドにコメントを残すことは正しいと思います。また、コード ビハインドについては、コメントすることで正確に意図を明確にします。

どう思いますか?私がそれを作るべきではない他のアイデアはありますか?

4

2 に答える 2

1

シナリオに BDD の When がない場合がありますか?

Specflow では、指定された when または then は必須ではありません。

ただし、あなたの例では、これが Specflow と BDD をうまく使用しているとは思いません。この回答で、マーカスは次のように述べています。

「BDD は正しいものを構築していることを保証するものであり、TDD はそれを正しく構築していることを保証するものです。」

あなたの例では、テスト対象のスコープ、つまり CustomStack は、TDD を介してテストする必要があります。これは、CustomStack を使用する最終的なソリューションであり、BDD (したがって SpecFlow) を介してテストする必要があります。たとえば、この CustomStack が Web サイトで特定のアクションを介して実行されている場合などです。

この回答は、あなたの質問にも関連しています。

于 2013-12-13T00:20:02.363 に答える