您好,我的 Controller 中有以下查询,我想编写 Rspec 规范。我是 Rspec 的新手,我不知道如何编写规范。请帮忙
table1.includes(:table2).where(table1: {id: params[:id]}).includes(:table3)
我也尝试研究模拟和 stub ,但我不明白如何将它们用于这样的查询。
谢谢
最佳答案
当面对这些问题时,我倾向于将查询封装在一个方法中。这样一来,您就可以简单地用数据来 stub 该方法,而不必担心数据清理问题。
例如:
def fetch_table1_results(id)
table1.includes(:table2).where(table1: {id: id}).includes(:table3)
end
此时,当您需要测试依赖它的东西时,您可以将这个方法 stub :
awesome_model = stub_model(Table1, fetch_table1_results: [1, 2, 'etc']) # You should include models, stubs, or mocks here.
就测试实际方法而言,我不确定您是否需要这样做。该方法链中没有太多有趣的部分。如果你想完整,这里是案例:
- 确保
fetch_table1_results
使用 id 调用 Table1.find 的任何实例 - 确保
fetch_table1_results
eager-loadstable2
和table3
后者的实现方式各不相同,但我更喜欢直接检查数据库查询(而且这不是一个流行的观点)。所以你可以输入如下内容:
fetch_table1_results(1).to_sql.should include('JOIN table2')
那个,或者类似的东西。我还应该注意,这些测试应该在模型中,而不是 Controller 中。
关于ruby-on-rails - 如何为以下查询编写 Rspec 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17581411/