14

コントローラーで宝石を使用していstrong_parametersますが、それをテストする方法を理解するのに苦労しています。

これが私のセットアップの例です

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

メソッドをテストして、悪意のあるキーと値のペアが正しくフィルター処理されていることを確認したいのですが、そのuser_params方法がわかりません。他の誰かがこれを経験しましたか?

4

3 に答える 3

17

次のように params ハッシュをスタブできます

params = ActionController::Parameters.new(your_hash)

これは、コントローラーで URL パラメーターが変換されるクラスであり、require メソッドと permit メソッドを提供します。

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

于 2013-05-15T23:38:12.267 に答える
6

必要に応じてこれを変更します。

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: 'mymail@yopmail.com' }
    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
于 2016-02-20T09:26:36.843 に答える
0

をテストするかどうかはわかりませんが、これは gemstrong_parametersを介して使用していると思います。

gem には独自の testsがあるため、期待どおりに動作すると想定できます。

これは「Rails のテスト」の例ですが、これは不要だと思います。宣伝されているように動作することはテストしませんattr_accessible(Rails のテスト) またはattr_accessor(Ruby のテスト)。

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

于 2013-05-16T04:20:53.607 に答える