Ruby on rails RSpec:试验范围

Ruby on rails RSpec:试验范围,ruby-on-rails,testing,rspec,eager-loading,Ruby On Rails,Testing,Rspec,Eager Loading,我的一个模型的默认作用域设置为自动加载带有includes()的相关模型。如何使用RSpec测试此功能?我试着跑步: Model.includes(:relation).to_sql 希望我能检测到SQL中的签名,但它只返回以下内容: SELECT "models".* FROM "models" 没有提到关系,显然是通过第二次查询完成的。您建议如何进行此测试?我可能会继续使用Stub方法并设定期望值 该模式将为您的模型添加一个test-double,并设置它接收.includes方法调用的

我的一个模型的默认作用域设置为自动加载带有
includes()
的相关模型。如何使用RSpec测试此功能?我试着跑步:

Model.includes(:relation).to_sql
希望我能检测到SQL中的签名,但它只返回以下内容:

SELECT "models".* FROM "models"

没有提到关系,显然是通过第二次查询完成的。您建议如何进行此测试?

我可能会继续使用Stub方法并设定期望值

该模式将为您的模型添加一个test-double,并设置它接收
.includes
方法调用的期望值

测试Rails创建的实际SQL调用似乎更多的是测试Rails,而不是您的应用程序,并将其与实现紧密结合。测试该方法是否被调用是一个很好的折衷办法,因为如果调用它,Rails将做正确的事情

这里有更多信息可以更好地理解该过程。

包括(:关系)
将向查询中添加一个
左外部联接关系。这意味着您可以在查询中使用
关系
,而无需
连接(:关系)


我不知道如何应用它,您能否给出一些示例代码,说明如何测试
includes
方法是否被调用?我同意,测试原始SQL有点太接近实现,不太实际。我的意图是将其与另一个查询生成的SQL进行比较,将其限制为仅测试结果
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