Обновление до rspec 3 вызывает ошибку при использовании должно иметь (1).error_on
Так как я обновил свой Gemfile и перешел на rspec 3, во многих тестах я получаю сообщение об ошибке: путь:
it "should reject attribute that are too short" do
short = "a" * 3
hash = @attr.merge(:details => short)
Deal.new(hash).should have(1).error_on(:details)
end
Я получаю эту ошибку:
Failure/Error: Deal.new(hash).should have(1).error_on(:details)
NoMethodError:
undefined method `have' for #<RSpec::ExampleGroups::Deal_2::TestsOnDealsModelsValidations>
Я читал, что теперь я должен использовать "ожидать" вместо "но", но здесь с have(1).error_on
, как я должен писать его для соответствия rspec 3?
Я пробовал следующее, но он все еще не работает:
it "should reject attribute that are too short" do
short = "a" * 3
hash = @attr.merge(:details => short)
expect(Deal.new(hash).error_on(:details).size).to eq(1)
end
Ответы
Ответ 1
Я заменил подобных
Deal.new(hash).should have(1).error_on(:details)
с
deal = Deal.new(hash)
expect(deal.valid?).to be_falsey
expect(deal.errors[:details].size).to eq(1)
Первое ожидание с valid?
необходимо, поскольку оно инициализирует список errors
.
Ответ 2
have
и другие аналогичные матчи были перемещены из ядра rspec и в другой драгоценный камень, rspec-collection-matchers.
Я рекомендую следовать пути обновления от rspec 2 → 3, как описано в документах rspec: https://relishapp.com/rspec/docs/upgrade
- Обновление до rspec 2.99
- Запустите тестовый пакет
- Исправление предупреждений об отставке
- Обновление до rspec 3.
Если бы вы это сделали, вы бы получили ошибку устаревания с вашим кодом, который также сказал бы вам, что делать, чтобы исправить его.
Ответ 3
Строка, добавляемая к вашему Gemfile
, должна быть:
gem 'rspec-collection_matchers'