1

我需要测试一段代码是否执行了两个 sql 语句,我这样做是说

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

但是,该代码还执行了许多我不关心的其他语句,这会使测试出错。我如何告诉 Rspec 确保它在已执行语句的列表中s1s2

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 回答