【问题标题】:How to write Rspec spec for the following query如何为以下查询编写 Rspec 规范
【发布时间】:2013-07-10 21:42:44
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 你想测试什么?
  • 您是想测试它是否在特定时间内运行,它是否“正确”并返回预期的结果,还是其他?在我们提供帮助之前,您需要知道要测试什么。
  • @ChrisHeald , Normalocity - 我想确保查询返回所需的结果。

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


【解决方案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 eager-loads table2 和table3

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2021-05-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多