我的某个模型的默认范围设置为使用includes()
自动加载相关模型。如何使用RSpec测试此功能?我试过跑:
Model.includes(:relation).to_sql
希望我能在SQL中检测到签名,但它只返回了这个:
SELECT "models".* FROM "models"
没有提到这种关系,显然是用第二个查询完成的。您如何推荐测试?
答案 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