1

我正在使用主要是脚手架生成的 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"})

为什么会失败?

4

3 回答 3

1

冒着说明明显的风险,因为您收到 Mocha 错误,在我看来,您需要禁用 Mocha 或将其配置为与 RSpec 一起使用。

您可以通过将 gem 从 Gemfile 中删除并重新执行来禁用它bundle install。或者,您可以在指定 gem 时添加一个“require:false”参数,以便它不会自动加载,每个Bundler:Gemfile 中的 :require => false 是什么意思?

配置 Mocha 以使用 RSpec 的说明位于https://relishapp.com/rspec/rspec-core/v/2-14/docs/mock-framework-integration/mock-with-mocha

于 2013-11-16T04:06:18.640 回答
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

于 2014-02-04T21:37:06.370 回答
-1

Mocha 与许多其他模拟框架一样,要求您在运行被测代码之前提出您的期望。

因此,在您的测试中,交换两行;即Invoice.create! Invoice.any_instance.should_receive调用。

于 2013-11-14T20:37:45.853 回答