Asserting that a particular exception is thrown in Cucumber

Сценарий

Я пишу библиотеку (без Ruby on Rails), для которой я хотел бы иметь очень подробные возможности Cucumber. Особенно это касается описания ошибок/исключений, которые должны возникать в различных случаях.

Пример

Наиболее интуитивный способ написать шаги в Cucumber, вероятно, был бы чем-то вроде

When I do something unwanted
Then an "ArgumentError" should be thrown

Проблема

Есть две проблемы, которые я должен решить:

  1. Первый шаг не должен завершиться неудачей, когда выбрасывается исключение.
  2. Исключение, которое выбрасывает первый шаг, должно быть доступно второму шагу, чтобы сделать некоторую магию утверждения.

Неэлегантное и громоздкое решение

Лучший подход, который я смог придумать, это кэширование исключения на первом шаге и помещение его в переменную экземпляра, к которой может получить доступ второй шаг, примерно так:

When /^I do something unwanted$/ do
  begin
    throw_an_exception!
  rescue => @error
  end
end

Then /^an "(.*)" should be thrown$/ do |error|
  @error.class.to_s.should == error
end

Однако это делает первый шаг более или менее бесполезным в случаях, когда я не хочу, чтобы он провалился, и требует переменной экземпляра, что никогда не бывает хорошо.

Итак, может ли кто-нибудь помочь мне с хотя бы менее громоздким решением? Или я должен написать свои функции по-другому? Любая помощь будет очень признательна.

17
задан JLimperg 9 February 2012 в 22:35
поделиться