ruby-on-rails - 如何为以下查询编写 Rspec 规范

您好,我的 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-loads table2table3

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

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

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

https://stackoverflow.com/questions/17581411/

相关文章:

python - 带有滚动条的 tkinter 表格显示

bash - 使用 sendmail 强制内容类型

perl - 跳过(不执行该行)perl 调试器中的一行

sql - 带有 OFFSET 的总行数 .. FETCH 问题

Magento - 如何为处理订单启用取消按钮(已创建发票)

uiview - UIView 标签属性的最大值

sql-server - 在存储过程中批处理多个合并是个好主意吗

C# - 从 ContextMenuStrip 和 "Smart Events"动态添加和删除项目

carrierwave - Sidekiq 一遍又一遍地重复同样的工作

python - 如何在没有用户交互的情况下在在线服务器上启动后连续运行 python 脚本?