Как прикрепить сообщение к проверке rspec? - PullRequest
40 голосов
/ 15 ноября 2010

В rspec: Могу ли я прикрепить сообщение к проверке так же, как это делалось бы в тестовых средах стиля xUnit?Как?

assert_equal value1, value2, "something is wrong"

Ответы [ 3 ]

56 голосов
/ 15 ноября 2010

should и should_not принимают второй аргумент (message), который переопределяет стандартное сообщение matcher.

1.should be(2), 'one is not two!'

Сообщения по умолчанию обычно довольно полезны.

Обновление:

для RSpec 3:

expect(1).to eq(2), "one is not two!"
27 голосов
/ 15 ноября 2010

В RSpec работа диспетчера состоит в том, чтобы напечатать разумное сообщение об ошибке.Универсальные средства сопоставления, которые поставляются с RSpec, могут, очевидно, печатать только общие неописуемые сообщения об ошибках, поскольку они ничего не знают о вашем конкретном домене.Вот почему рекомендуется писать собственные сопоставления для конкретного домена, что даст вам как более читаемые тесты, так и более читаемые сообщения об ошибках.

Вот пример из документации RSpec :

require 'rspec/expectations'

RSpec::Matchers.define :be_a_multiple_of do |expected|
  match do |actual|
    (actual % expected).zero?
  end
  failure_message_for_should do |actual|
    "expected that #{actual} would be a multiple of #{expected}"
  end
  failure_message_for_should_not do |actual|
    "expected that #{actual} would not be a multiple of #{expected}"
  end
  description do
    "be multiple of #{expected}"
  end
end

Примечание: требуется только match, остальные будут созданы автоматически.Однако суть вашего вопроса, конечно, в том, что вы не похожи на сообщения по умолчанию, поэтому вам нужно как минимум также определить failure_message_for_should.

Также вы можете определить match_for_should и match_for_should_not вместо match, если вам нужна различная логика в положительном и отрицательном случае.

Как показывает @Chris Johnsen, вы также можете явно передать сообщение ожиданию.Однако вы рискуете потерять преимущества читабельности.

Сравните это:

user.permissions.should be(42), 'user does not have administrative rights'

с этим:

user.should have_administrative_rights

Это будет (примерно) реализовано такэто:

require 'rspec/expectations'

RSpec::Matchers.define :have_administrative_rights do
  match do |thing|
    thing.permissions == 42
  end
  failure_message_for_should do |actual|
    'user does not have administrative rights'
  end
  failure_message_for_should_not do |actual|
    'user has administrative rights'
  end
end
6 голосов
/ 03 июля 2015

В моем случае это была проблема с круглыми скобками:

        expect(coder.is_partial?(v)).to eq p, "expected #{v} for #{p}"

это привело к неверному количеству аргументов, в то время как правильный путь:

        expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}"
...