RSpec:测试范围渴望加载

时间:2013-12-01 23:16:00

标签: ruby-on-rails testing rspec eager-loading

我的某个模型的默认范围设置为使用includes()自动加载相关模型。如何使用RSpec测试此功能?我试过跑:

Model.includes(:relation).to_sql

希望我能在SQL中检测到签名,但它只返回了这个:

SELECT "models".* FROM "models"

没有提到这种关系,显然是用第二个查询完成的。您如何推荐测试?

2 个答案:

答案 0 :(得分:0)

我可能会采用简化方法并设定期望的方式。

模式是添加模型的测试双精度并设置它接收.includes方法调用的期望

测试Rails创建的实际SQL调用似乎更多的是测试Rails而不是你的应用程序,并将其与实现紧密结合。测试该方法被调用是一个很好的中间立场,知道如果它被调用,Rails将做正确的事情。

此处有更多信息https://www.relishapp.com/rspec/rspec-mocks/v/2-14/docs/method-stubs可以更好地了解这一过程。

这里有一些实用的使用技巧http://solnic.eu/2012/02/02/yes-you-should-write-controller-tests.html

答案 1 :(得分:0)

includes(:relation)将向您的查询添加left outer join relations。这意味着您可以在查询中使用relations,而不必joins(:relations)

let!(:model) {
  Model.create!( field: 42 )
}
let!(:relation) {
  model.relations.create!( this: "that")
}

it 'includes relation' do
  expect( Model.where("relations.this": "that") ).to contain_exactly(relation)
end