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

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

您好,我的 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 中。

关于ruby-on-rails - 如何为以下查询编写 Rspec 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17581411/

相关文章:

mysql - 如何在 Rails 中并行建立与多个数据库的连接?

sql - 基于 has_many 模型列的结果计数的 Rails 查询

ruby-on-rails - 如何在 Rspec 3 功能规范中 stub Rails 帮助器/模块方法?

mysql - 无法使用 gitlab-ci.yml 连接到 MySql

javascript - 如果选中复选框,则显示表单的其余部分

javascript - jQuery 或 Javascript 自动格式化电话掩码

ruby-on-rails - 守卫 --listen-on with vagrant

ruby-on-rails - 根据环境使用 Rails 进行条件渲染

ruby-on-rails - 如何配置与非 ActiveRecord 模型的 has_many 关联

rspec - 使用 Capybara + RSpec 测试页面重定向