Я видел, как мне кажется, два подхода к BDD. Разница зависит от местоположения «когда»:
В подходе 1 время является частью спецификации:
AnEmptyStack.isNoLongerEmptyAfterPush
В чистой терминологии "дано тогда" это:
"Если задан пустой стек, когда он помещается, он больше не пуст."
Таким образом, «когда» является частью метода спецификации:
isNoLongerEmptyAfterPush(){
stack.push(anObject);
Assert.notEmpty(stack);
}
В подходе 2 время определяется на уровне класса. То есть когда обычно вызывается в настройке.
class WhenAnEmptyStackIsPushed(){
setup(){
stack.push();
}
public void thenItIsNotEmpty(){
assert(stack.notEmpty())
}
}
Есть ли предпочтительный метод? С точки зрения чистого тестирования поведения, мне кажется, что второй вариант предпочтительнее, так как в центре внимания тестового устройства лежит поведение.
Однако для простоты тестирования я склоняюсь к первому способу. Большая часть боли, которую я испытываю при тестировании, связана с настройкой. То есть я должен получить СУТ в определенном состоянии. Находясь в этом состоянии, обычно это всего одна строка кода, которая фактически вызывает какое-то поведение в нем. Таким образом, наличие нескольких вариантов поведения для каждого класса (т. Е. Для контекста настройки) использует однократную настройку класса.
Итак, я ищу мысли. Один подход предпочтительнее другого?