ruby-on-rails - RSpec:如何测试 includes().where() 中的参数是否正确

标签 ruby-on-rails testing rspec bdd rspec-rails

我是 Ruby on Rails 的 Rspec 测试新手,我有一个关于 Controller 测试的问题。

请建议我如何测试这条线:

@dreams = Dream.public_dreams.includes(:user).where("users.type_id = ?", 5)

换句话说,我想测试是否在 Controller 中设置了正确的参数。它应该显示type_id等于5的用户的所有梦想。
有人可以帮帮我吗?

最佳答案

既然你已经指出你“想要确保……显示的梦想 [are] 仅属于 type_id 等于 5 的用户”,在我看来这更像是模型规范而不是 Controller 规范,并且我可能会重构代码并将其规范为如下所示(假设您仍想保持严格的条件):

首先,将查询重构为模型中的范围:

class DreamsController < ApplicationController
  def your_action
    @dreams = Dream.public_dreams_for_type_five_users
  end
end

class Dream < ActiveRecord::Base
  def self.public_dreams
    # your code here to access public dreams
  end

  def self.public_dreams_for_type_five_users
    public_dreams.includes(:user).where("users.type_id = ?", 5)
  end
end

接下来,根据数据库中的某些条目测试模型规范中的范围,这些条目将通过和未达到您的预期(以下规范使用 FactoryGirl 语法,但您可以将其替换为您喜欢的任何夹具替代库) :

require 'spec_helper'

describe Dream do
  describe ".public_dreams_for_type_five_users" do
    let(:type_five_user_public_dreams) { Dream.public_dreams_for_type_five_users }

    context "for users where type_id is 5" do
      let!(:type_five_dream) { create(:dream, user: create(:user, type_id: 5)) }

      it "includes the user's public dreams" do
        expect(type_five_user_public_dreams).to include(type_five_dream)
      end
    end

    context "for users where type_id is not 5" do
      let!(:type_six_dream) { create(:dream, user: create(:user, type_id: 6)) }

      it "does not include the user's public dreams" do
        expect(type_five_user_public_dreams).to_not include(type_six_dream)
      end
    end
  end
end

如果您愿意,您可以进一步将类方法概括为类似于 Dream.public_dreams_for_users_of_type(id) 的内容,并相应地更改规范。

关于ruby-on-rails - RSpec:如何测试 includes().where() 中的参数是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526935/

相关文章:

html - 使用 ruby​​ 变量作为 html 代码

javascript - Jest 中的嵌套模拟函数

Ruby EventMachine 测试

ruby-on-rails - Rails 自定义验证器 : Testing options

ruby-on-rails-3 - Cucumber+Capybara 中的语法错误

ruby-on-rails - 设计不生成rails标准URL

ruby-on-rails - ActionMailer 不在开发 Rails 5 中发送邮件

ruby-on-rails - 如何使用 PostgreSQL 全文搜索返回部分短语匹配而不返回太多行?

scala - 如何处理scala中外部命令的用户交互

dom - capybara 断言元素为空