При написании спецификации, которая проверяет raise_error
, вы должны использовать синтаксис блока {}
для expect
:
expect { my_method(p1, p2, p3, p4, bad5) }.to raise_error(ArgumentError)
Существует гораздо более подробное объяснение в ответах на этот вопрос , но вы попросили объяснение, поэтому я дам вам сокращенное:
Большинство сопоставителей rspec являются сопоставителями значений. Это означает, что что-то вроде этого:
expect(some_method).to eq(value)
действительно говорит:
выполните some_method
и получите его возвращаемое значение, затем сравните его возвращаемое значение с value
и оцените успех или неудачу этой спецификации в этом сравнении
Когда вы пытаетесь протестировать некоторый фрагмент кода, который имеет побочный эффект, например, возможно, вызывает исключение, rspec должен получить блок кода для запуска. Это немного больше похоже на:
expect { <some block of code> }.to raise_error(ArgumentError)
выполнить <some block of code>
, а затем сравнить то, что происходит при выполнении этого кода, с ожидаемым, и оценить успех или неудачу этой спецификации в этом сравнении
Этот ответ для вышеуказанного вопроса подробно описывает, когда вам нужно использовать expect {}
и когда вам нужно использовать expect()
.