1

コードの一部が2つのSQLステートメントを実行することをテストする必要があります。

  ActiveRecord::Base.connection.should_receive(:execute).with("s1")
  ActiveRecord::Base.connection.should_receive(:execute).with("s2")

ただし、このコードは、私が気にしない他の多くのステートメントも実行するため、テストが失敗します。Rspecに、実行されたステートメントのリストに含まれs1ていることを確認するように指示するにはどうすればよいですか?s2

4

1 に答える 1

2

RSpecのバージョンを2.12に更新すると、and_call_originalメソッドにアクセスできるようになります(ドキュメントユースケースを参照してください)。executeそのメソッドを使用して、のメソッドをスタブActiveRecord::Base.connectionし、元のメソッドを呼び出してから、必要な期待値を追加することができます。

ActiveRecord::Base.connection.stub(:execute).and_call_original
ActiveRecord::Base.connection.should_receive(:execute).with(:s1)
ActiveRecord::Base.connection.should_receive(:execute).with(:s2)

何らかの理由で最新バージョンのRSpecを使用していない(または使用したくない)場合は、次の方法で同じ機能を実現できます。

execute = ActiveRecord::Base.connection.method(:execute)
ActiveRecord::Base.connection.should_receive(:execute).with(:s1)
ActiveRecord::Base.connection.should_receive(:execute).with(:s2)
ActiveRecord::Base.connection.stub(:execute) { |*args| execute.call(*args) }

参照:

于 2012-11-17T05:25:56.757 に答える