RSpec:如何在includes()中测试参数是否正确。哪里()

时间:2013-10-22 19:45:27

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

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

请建议我如何测试这一行:

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

换句话说,我想测试控制器中是否设置了正确的参数。它应显示type_id等于5的用户的所有梦想  请有人帮助我吗?

3 个答案:

答案 0 :(得分:2)

有几个答案:

  1. 您可以测试查询本身:
    我会将此类查询放在Dream模型的方法或范围内。
    然后在模型中测试查询规格。

  2. 您可以测试作业:
    另一方面,您可以使用assigns[:dreams]

  3. 在控制器规格中测试正确的作业

答案 1 :(得分:2)

既然你已经表明你“想要确保...只显示那些type_id等于5”的用户,那么这似乎更像是模型规范而不是控制器规范,我可能会重构代码并指出它看起来像这样(假设你仍然想要保持严格的条件):

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

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语法,但您可以将其替换为任何fixture-substitute库等):

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),并相应地更改规格。

答案 2 :(得分:0)

@dreams.select { |dream| dream.user.type_id = 5 }.should eq(@dreams)