我需要测试一段代码是否执行了两个 sql 语句,我这样做是说
ActiveRecord::Base.connection.should_receive(:execute).with("s1")
ActiveRecord::Base.connection.should_receive(:execute).with("s2")
但是,该代码还执行了许多我不关心的其他语句,这会使测试出错。我如何告诉 Rspec 确保它在已执行语句的列表中s1
?s2
我需要测试一段代码是否执行了两个 sql 语句,我这样做是说
ActiveRecord::Base.connection.should_receive(:execute).with("s1")
ActiveRecord::Base.connection.should_receive(:execute).with("s2")
但是,该代码还执行了许多我不关心的其他语句,这会使测试出错。我如何告诉 Rspec 确保它在已执行语句的列表中s1
?s2
将您的 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) }
参考: