Обновление до 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'