我需要测试一段代码执行两个sql语句,我正在说
ActiveRecord::Base.connection.should_receive(:execute).with("s1")
ActiveRecord::Base.connection.should_receive(:execute).with("s2")
然而,该代码还执行了许多其他我不关心的语句,这些语句会导致测试失败。如何告诉Rspec确保s1
和s2
在执行语句列表中?
答案 0 :(得分:2)
将您的RSpec版本更新为2.12,您将可以访问and_call_original
方法(请参阅documentation和use cases)。使用该方法,您可以存根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) }
参考文献: