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

仕様が実行されると、データベースに 1 つの請求書が作成され、適切に更新されます。ただし、次のメッセージが表示され、失敗します。

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 で使用するように構成する必要があるようです。

Gemfile から削除して再実行することで、gem を無効にすることができますbundle install。または、Gem を指定するときに 'require: false` 引数を追加して、自動ロードしないようにすることもできます。Bundler: What does :require => false in a Gemfile mean?

RSpec で動作するように Mocha を構成する手順は、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の代わりにexpectsを使用して解決しました。次のような期待を使用するには、それを更新する必要があるだけかもしれません。


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 は、他の多くのモック フレームワークと同様に、テスト対象のコードを実行する前に期待値を設定する必要があります。

したがって、テストでは、2 つの行を入れ替えます。つまり、Invoice.create! 後に Invoice.any_instance.should_receive呼び出します。

于 2013-11-14T20:37:45.853 に答える