我是 Ruby on Rails 的 Rspec 测试的新手,我有一个关于控制器测试的问题。
请建议我如何测试这条线:
@dreams = Dream.public_dreams.includes(:user).where("users.type_id = ?", 5)
换句话说,我想测试控制器中是否设置了正确的参数。它应该显示type_id
等于的用户的所有梦想5
。
有人可以帮帮我吗?
我是 Ruby on Rails 的 Rspec 测试的新手,我有一个关于控制器测试的问题。
请建议我如何测试这条线:
@dreams = Dream.public_dreams.includes(:user).where("users.type_id = ?", 5)
换句话说,我想测试控制器中是否设置了正确的参数。它应该显示type_id
等于的用户的所有梦想5
。
有人可以帮帮我吗?
对此有几个答案:
您可以测试查询本身:
我会将这样的查询放在您Dream
模型的方法或范围中。
然后在模型规范中测试查询。
您可以测试分配:
另一方面,您可以在控制器规范中测试正确的分配assigns[:dreams]
既然你已经表明你“想确保......显示的梦想 [是] 只有 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语法,但您可以将其替换为您喜欢的任何夹具替代库):
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)
并相应地更改规范。
@dreams.select { |dream| dream.user.type_id = 5 }.should eq(@dreams)
?