如何为以下查询编写Rspec规范

时间:2013-07-10 21:42:45

标签: ruby-on-rails activerecord rspec rspec2 rspec-rails

您好我的控制器中有以下查询,我想编写Rspec规范。我是Rspec的新手,我不知道如何编写规范。请帮助

table1.includes(:table2).where(table1: {id: params[:id]}).includes(:table3)

我也试过调查模拟和存根,但我不明白如何将它们用于这样的查询。

谢谢

1 个答案:

答案 0 :(得分:1)

当遇到这些问题时,我倾向于将查询封装在方法中。这样,您可以简单地使用数据来存储方法,而无需担心数据卫生。

例如:

def fetch_table1_results(id)
  table1.includes(:table2).where(table1: {id: id}).includes(:table3)
end

此时,您可以在需要测试依赖于它的内容时隐藏该方法:

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热切加载table2table3

后者的方式各不相同,但我更喜欢直接检查数据库查询(并且这不会是一种流行的观点)。所以你可以输入如下内容:

fetch_table1_results(1).to_sql.should include('JOIN table2')

那,或类似的东西。我还应该注意,这些测试应该在模型中,而不是控制器。