Не удалось выполнить ожидание RSpec update_attributes, хотя обновление работает

Я использую то, что в значительной степени является спецификацией RSpec, сгенерированной каркасом, которая терпит неудачу, но не должна быть. Вот спецификация:

describe "PUT update" do
    describe "with valid params" do
      it "updates the requested invoice" do


      invoice = Invoice.create!

       Invoice.any_instance.should_receive(:update_attributes).with({"number" => "MyString"  })
    put :update, {:id => invoice.id, :invoice => { "number" => "MyString" }}
  end

Когда спецификация запускается, в базе данных создается один счет-фактура, который соответствующим образом обновляется. Однако я получаю это сообщение и терплю неудачу:

RSpec::Mocks::MockExpectationError: (#<Mocha::ClassMethods::AnyInstance:0x653a9a8>).update_attributes({"number"=>"MyString"})
expected: 1 time with arguments: ({"number"=>"MyString"})
received: 0 times with arguments: ({"number"=>"MyString"})

Почему это не удается?


person Jeffrey Alan Lee    schedule 13.11.2013    source источник
comment
Вы используете и RSpec::Mocks, и Mocha?   -  person Peter Alfvin    schedule 13.11.2013
comment
Драгоценный камень Mocha установлен.   -  person Jeffrey Alan Lee    schedule 14.11.2013
comment
Предполагая, что вы хотите использовать Mocha с RSpec, следовали ли вы инструкциям на странице relishapp.com/rspec/rspec-core/v/2-14/docs/?   -  person Peter Alfvin    schedule 14.11.2013
comment
На самом деле установленный гем Mocha является пережитком того времени, когда я впервые настраивал проект и не решил использовать RSpec (в отличие от Minst, который я использовал в прошлом). RSpec не настроен на использование мокко.   -  person Jeffrey Alan Lee    schedule 16.11.2013


Ответы (3)


Рискуя констатировать очевидное, поскольку вы получаете ошибку Mocha, мне кажется, вам нужно либо отключить Mocha, либо настроить его для использования с RSpec.

Вы можете отключить гем, удалив его из Gemfile и повторно выполнив bundle install. Или вы можете добавить аргумент «require: false» при указании драгоценного камня, чтобы он не загружался автоматически, согласно Bundler: Что означает :require =› false в Gemfile?

Инструкции по настройке Mocha для работы с RSpec находятся в https://relishapp.com/rspec/rspec-core/v/2-14/docs/mock-framework-integration/mock-with-mocha

person Peter Alfvin    schedule 16.11.2013
comment
Очевидное часто является ответом. Собственно, в этом и была проблема. Я должен был уловить это. Мне неясно, почему Mocha вмешивался, поскольку RSpec должен был использовать свои собственные средства для насмешек. - person Jeffrey Alan Lee; 17.11.2013

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


describe "PUT update" do
  describe "with valid params" do
    it "updates the requested invoice" do
      invoice = Invoice.create!
      Invoice.any_instance.expects(:update_attributes).with({"number" => "MyString"  })
      put :update, {:id => invoice.id, :invoice => { "number" => "MyString" }}
    end
  end
end

person wallerjake    schedule 04.02.2014

Mocha, как и многие другие фиктивные фреймворки, требует, чтобы вы озвучили свои ожидания перед запуском тестируемого кода.

Поэтому в своем тесте поменяйте местами две строки; то есть вызовите Invoice.create! после Invoice.any_instance.should_receive.

person Kenrick Chien    schedule 14.11.2013
comment
Обновление атрибутов обновления уже происходит после установки экспедиций в следующей строке. - person Peter Alfvin; 15.11.2013