2013-05-15 12 views
12

コントローラにstrong_parametersの宝石を使用していますが、テストする方法がわかりません。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

あなたはこれがあなたのURLのparamsをお使いのコントローラにに変換されているクラスである

params = ActionController::Parameters.new(your_hash) 

としてparamsハッシュをスタブすることができ、そしてそれはあなたの必要とし、許可する方法を示します。

個人的には、認証ポリシーを処理する新しいクラスに機能的に抽出します。

0

私はあなたがthe gem経由で使用していると推測しているstrong_parametersをテストするか分からない。

宝石にはits own testsがありますので、期待通りに動作すると見なすことができます。

これは「テスト用のRails」の例ですが、これは不要だと思います。私はattr_accessibleが広告されたもの(Testing Rails)、またはattr_accessor(Rubyのテスト)として動作することをテストしません。

IMHOの場合、統合テストでは、成功/失敗のすべての望ましいインスタンスをカバーし、暗黙のうちにstrong_parameter構成をカバーする必要があります。

+3

当社のテストポリシーが明示的に潜在的に私たちを可能にするために、すべての機能のためのテストを書くことですスイッチの宝石/私たちは自分自身をロールして、システムが機能していることをまだ知っています。 – Bryce

+10

また、strong_parametersで統合されたコードが適切に動作しているかどうかをテストすることもできます。私は、ユーザーの役割や権限に応じて書き込み可能/書き込み不可能なフィールドを持っているので、これら2つのコンポーネントが適切に統合されていることをテストする必要があります。 – 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 
関連する問題