2013-12-12 3 views
1

В настоящее время я изучаю/тестирую BDD с помощью 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 правильно, так что требование бизнеса не хватает какой-либо информации, и на коде позади , Я ясно дал понять, что мое намерение заключается именно в комментировании.

Как вы думаете? Любые другие идеи, почему я не должен этого делать?

+0

Оба ответа предоставлены GREAT!Мне сейчас трудно выбрать, что принять в качестве самого ответа на мой вопрос, так как они затрагивают проблему по-разному, и оба ответа могут быть столь же хорошими, как и другие. Во-первых, я знаю, что хочу ошибку, поэтому просто введите код «Когда» соответственно. Я абсолютно согласен! Во-вторых, технические вопросы, такие как нажатие нулевой точки в стеке, не должны иметь значения для заинтересованного лица, поскольку это, скорее всего, представляет собой технический интерес, и это делает линию между BDD и TDD. Я абсолютно согласен! –

+0

@ Ответ Alski показывает, как SpecFlow можно использовать для тестирования этого CustomStack, однако я все же чувствую, что использование среды BDD для тестирования отдельного компонента в изоляции является чрезмерным. BDD обычно используется для описания того, как пользователь взаимодействует с системой; в вашем примере пользователь не будет напрямую вытаскивать элемент из стека, вместо этого они будут выполнять действие в приложении, которое использует CustomStack, который затем вызывает всплытие стека. Следовательно, причина, по которой я считаю, что CustomStack лучше тестируется с использованием TDD и модульных тестов. Будет интересно посмотреть, что думает Алски. –

+0

Я полностью согласен, свежий. В реальном мире BDD означает тестирование поведения системы в целом. Из-за этого, строго говоря BDD, ваш ответ лучше всего подходит для реального решения. Кроме того, ответ Алски отвечает потребностям учебника, то есть может использовать как «Когда», где происходит действие, так и «Тогда», где он должен быть проверен на ожидаемое значение/поведение. Моя дилемма вокруг того, что предлагает Алски, который решает мою проблему, и действительно мы видим, где стоит линия между BDD и TDD, потому что на самом деле эти исключения не принадлежат BDD, а TDD. –

ответ

2

Существует еще один трюк, который вы можете использовать, когда привязки помогают сделать функцию более понятной. В этом случае, давайте начнем в конце.

Then I should get an error 

Ваша проблема в основном здесь, вы знаете, хотите ошибку, но вы не знаете, как ее получить. На самом деле вы уже пропустили его, ошибка уже произошла на этапе When, и в вашем примере кода вы переместили действие на шаг then, чтобы вы могли получить ошибку.

Но что, если держать when выполнения действия AMD повторно выразить 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, вы можете даже передать это состояние между связующими классами, если это необходимо.

+0

+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."

В вашем примере объем того, что испытывается то есть в CustomStack, должны быть проверены с помощью TDD. Это конечное решение, которое использует CustomStack, должно быть проверено через BDD (и, следовательно, SpecFlow), например. если этот CustomStack осуществляется через определенное действие на веб-сайте.

This ответ также подходит на ваш вопрос.

+0

+1 Спасибо за эти идеи. Я буду считать само собой разумеющимся, что проект модульных тестов по-прежнему уместен, хотя использование также BDD. Это заставляет линию не пересекать BDD и TDD. Кроме того, я следовал этой интересной статье, которая проверяет поведение стека, скажем, заинтересованная сторона хочет объект стека, поэтому мне интересно, какая строка не пересечет. http://www.ibm.com/developerworks/java/library/j-cq09187/index.html –

+0

Спасибо за ваш ответ. Я очень многому научился этому. Пожалуйста, см. Мой последний комментарий, связанный с моим вопросом, чтобы вы могли знать, почему я принял ответ Алского. Если вы чувствуете, что что-то не так с моим суждением, пожалуйста, не стесняйтесь говорить об этом, и я рассмотрю вопрос о том, чтобы вернуться к моему согласию. –

Смежные вопросы