пробном/за исключением подхода вы показываете на самом деле совершенно правильно, потому что он показывает путь, что вы на самом деле использовать код в реальной жизни. Однако есть причина, по которой вам это не совсем нравится. Это приводит к уродливым проблемы с вещами, как следующее:
Scenario: correct password accepted
Given that I have a correct password
When I attempt to log in
Then I should get a prompt
Scenario: correct password accepted
Given that I have a correct password
When I attempt to log in
Then I should get an exception
Если я пишу определение шага без попробовать/за исключением, то второй сценарий не удастся. Если я напишу его с помощью try/except, то в первом сценарии риск будет скрывать исключение, особенно если исключение произойдет после того, как приглашение уже было напечатано.
Вместо эти сценарии должны, имхо, можно записать в виде что-то вроде
Scenario: correct password accepted
Given that I have a correct password
When I log in
Then I should get a prompt
Scenario: correct password accepted
Given that I have a correct password
When I try to log in
Then I should get an exception
«I войти» шаг не следует использовать попробовать; «Я пытаюсь войти» подходит аккуратно, чтобы попытаться отдать тот факт, что может не быть успеха.
Затем возникает вопрос о повторном использовании кода между двумя почти, но не совсем идентичными шагами. Вероятно, мы не хотим иметь две функции, которые оба входа. Помимо простой общей функции, которую вы вызываете, вы также можете сделать что-то вроде этого в конце вашего файла шагов.
@when(u'{who} try to {what}')
def step_impl(context):
try:
context.exception=None
except Exception as e:
context.exception=e
Это будет автоматически конвертировать все шаги, содержащие слово «попытаться» на шаги с тем же именем, но с ПЫТАЮТСЯ удалены, а затем защитить их с Try/за исключением.
Есть несколько вопросов о том, когда вы на самом деле должны иметь дело с исключениями в BDD, поскольку они не являются видимыми пользователем. Это не часть ответа на этот вопрос, хотя я поставил их в separate posting.
Мне кажется, что обеспечение того, чтобы код выдавал определенные исключения в определенных сценариях, является довольно стандартной проверкой. Также полезно показать код клиента, какое поведение он может ожидать. Когда я проверяю это, я не проверю тесты! В любом случае это довольно стандартная функция большинства тестовых фреймворков. –