Ruby, rspec Ожидаемая ошибка при тестировании метода - PullRequest
0 голосов
/ 30 октября 2018

У меня есть метод, который выглядит как build_object(arg1, arg2, arg3, arg4, arg5) Я хочу проверить этот метод, когда определенное значение передается для arg5.

Я пытаюсь что-то вроде

expect(my_method(p1, p2, p3, p4, bad5)).to raise_error(ArgumentError)

Я получаю следующую ошибку:

ArgumentError:
   The expect syntax does not support operator matchers, so you must pass a matcher to `#to`.

Я новичок в тестировании Ruby и rspec, поэтому любая помощь приветствуется. Пожалуйста, объясните, что делает ваш ответ, чтобы я выучил.

1 Ответ

0 голосов
/ 30 октября 2018

При написании спецификации, которая проверяет 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...