Можно ли создать новый механизм сопоставления RSpec, составив существующие? - PullRequest
1 голос
/ 03 июля 2019

В одной из моих спецификаций я часто повторяю такие строки:

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) и вызывать ее из каждого примера спецификации, но я хотел бы сохранить синтаксис соответствия.

Можно ли это сделать?

1 Ответ

0 голосов
/ 03 июля 2019

Согласно это

Вы можете сделать что-то вроде этого:

RSpec::Matchers.define :be_successful do

  match do |result|
    result.status == :success &&
    result.offers.length > 0 &&
    result.comments.empty?
  end

  failure_message do |result|
    "Should have #{result} equal to be successful"
  end

  failure_message_when_negated do |result|
    "Should not have #{result} to be successful"
  end
end

Если вы повторно используете этот тест в другом месте более 3 раз, то имеет смысл создать новый сопоставитель и переопределить сообщения об ошибках (это не накладные расходы). Если вы используете этот тест только один раз, то имеет смысл сохранить его, не слишком абстрагируя его.

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