В одной из моих спецификаций я часто повторяю такие строки:
expect(result.status).to be(:success)
expect(result.offers).not_to be_empty
expect(result.comments).to be_empty
Чтобы сделать мои тесты более краткими и удобочитаемыми, я хочу скомпоновать их в такую строку:
expect(result).to be_successful
Я могу сделать это, создав собственный сопоставитель:
matcher :be_successful do
match { |result|
result.status == :success &&
result.offers.length > 0 &&
result.comments.empty?
}
end
Но теперь у меня тест на неудачу, и сообщение об ошибке совершенно бесполезно. Все, что он говорит сейчас, это Expected #<Result ...> to be successful
.
Я знаю, что могу переопределить сообщение об ошибке, но теперь это решение становится более сложным, чем стоит экономить 2 строки для каждого примера спецификации. Исходные 3 строки генерировали полезные сообщения об ошибках, все, что я хотел сделать, это объединить их в 1 строку.
Я мог бы переместить 3 строки в отдельную функцию (например, assert_successful
) и вызывать ее из каждого примера спецификации, но я хотел бы сохранить синтаксис соответствия.
Можно ли это сделать?