2013-11-13 3 views
1

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

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"}) 

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

+0

Вы используете как 'RSpec :: Mocks', так и' Mocha'? –

+0

Установлен камень Mocha. –

+0

Предполагая, что вы используете Mocha с RSpec, вы следовали строкам на https://relishapp.com/rspec/rspec-core/v/2-14/docs/mock-framework-integration/mock-with-mocha ? –

ответ

1

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

Вы можете отключить драгоценный камень, удалив его из Gemfile и повторно выполнив bundle install. Или же вы можете добавить «требуется: false` аргумент при определении драгоценный камень так, чтобы он не автозагрузку, в Bundler: What does :require => false in a Gemfile mean?

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

+0

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

-1

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

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

+0

Атрибуты обновления атрибутов уже появляются после того, как были установлены экспедиции, в следующей строке. –

0

У меня был подобный вопрос и Я решил это, используя ожидания, а не 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 
 

 Смежные вопросы

  • Нет связанных вопросов^_^