2013-05-15 34 views
12

我在我的控制器中使用了strong_parameters gem,但我很难理解如何测试它。RSpec - 测试强大的参数

这是我想测试user_params方法,以确保它是正确过滤掉恶意的键/值对我的设置

class UserController < ActionController::Base 
    include ActiveModel::ForbiddenAttributesProtection 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     ... 
    end 
    end 

    private 
    def user_params 
    params.require(:user).permit(:first_name, :last_name, :username, :email) 
    end 
end 

的例子,但无法弄清楚如何做到这一点。有没有其他人通过这个?

回答

14

您可以存根params哈希表作为

params = ActionController::Parameters.new(your_hash) 

这是你的网址参数被转换到你的控制器类,和它给你的需要和允许的方法。

我个人将功能提取出来放到一个新的类中来处理授权策略。

0

我不确定我会测试strong_parameters,我猜你正在使用the gem

该宝石有its own tests,所以我们可以假设它按预期工作。

这是'testing Rails'的例子,我认为这是不必要的。我不会测试attr_accessible作为广告(测试Rails),或attr_accessor(测试Ruby)。

恕我直言,您的集成测试应涵盖所有所需的成功/失败情况,并隐含涵盖您的strong_parameter配置。

+3

我们的测试的政策是明确写入测试所有的功能,让我们有可能切换宝石/稍后再滚动我们自己,并且仍然知道系统正在工作。 – Bryce

+10

您也可以测试与strong_parameters集成的代码是否正常工作。我有根据用户角色/权限可写/不可写的字段,所以我需要测试这两个部分是否正确集成。 – cpuguy83

+1

从Rails 1.1到3.2(现在准备4.0)的应用程序,我可以向你保证,测试Rails是非常必要的。在一个版本的Rails中单向工作的东西可能会改变另一个版本的行为。例如,我曾经使用clone方法克隆activerecord记录,但是在3.0到3.2之间,他们认为'dup'会提供该功能,而不是稍微不同。这个广告并不是很好,但很快就被我的测试所吸引。 – sockmonk

5

根据您的需要修改此,

describe "create action" do 
    it 'creates a user' do 
     User.should_receive(:create). 
     with({name: 'Alan D'}.with_indifferent_access) 
     post :create, user: 
     { first_name: 'Alan', last_name: 'Donald', username: 'alan77', email: '[email protected]' } 
    end 
end 

或其他替代解决这个问题是:

describe UsersController::UserParams do 
    it 'cleans the params' do 
    params = ActionController::Parameters.new(user: {foo: 'bar', name: 'baz'}) 
    user_params = UsersController::UserParams.build(params) 
    expect(user_params).to eq({name: 'baz'}.with_indifferent_access) 
    end 
end