В настоящее время я изучаю/тестирую 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
правильно, так что требование бизнеса не хватает какой-либо информации, и на коде позади , Я ясно дал понять, что мое намерение заключается именно в комментировании.
Как вы думаете? Любые другие идеи, почему я не должен этого делать?
Оба ответа предоставлены GREAT!Мне сейчас трудно выбрать, что принять в качестве самого ответа на мой вопрос, так как они затрагивают проблему по-разному, и оба ответа могут быть столь же хорошими, как и другие. Во-первых, я знаю, что хочу ошибку, поэтому просто введите код «Когда» соответственно. Я абсолютно согласен! Во-вторых, технические вопросы, такие как нажатие нулевой точки в стеке, не должны иметь значения для заинтересованного лица, поскольку это, скорее всего, представляет собой технический интерес, и это делает линию между BDD и TDD. Я абсолютно согласен! –
@ Ответ Alski показывает, как SpecFlow можно использовать для тестирования этого CustomStack, однако я все же чувствую, что использование среды BDD для тестирования отдельного компонента в изоляции является чрезмерным. BDD обычно используется для описания того, как пользователь взаимодействует с системой; в вашем примере пользователь не будет напрямую вытаскивать элемент из стека, вместо этого они будут выполнять действие в приложении, которое использует CustomStack, который затем вызывает всплытие стека. Следовательно, причина, по которой я считаю, что CustomStack лучше тестируется с использованием TDD и модульных тестов. Будет интересно посмотреть, что думает Алски. –
Я полностью согласен, свежий. В реальном мире BDD означает тестирование поведения системы в целом. Из-за этого, строго говоря BDD, ваш ответ лучше всего подходит для реального решения. Кроме того, ответ Алски отвечает потребностям учебника, то есть может использовать как «Когда», где происходит действие, так и «Тогда», где он должен быть проверен на ожидаемое значение/поведение. Моя дилемма вокруг того, что предлагает Алски, который решает мою проблему, и действительно мы видим, где стоит линия между BDD и TDD, потому что на самом деле эти исключения не принадлежат BDD, а TDD. –