В 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