2013-05-15 14 views
12

Ich benutze die strong_parameters Juwel in meinen Controllern, aber ich habe eine harte Zeit zu verstehen, wie ich es testen würde.RSpec - Testen starker Parameter

Hier ist ein Beispiel für mein Setup

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 

ich die user_params Methode testen will, um sicherzustellen, dass es richtig bösartige Schlüssel/Wert-Paare Ausfiltern ist, kann aber nicht herausfinden, wie es zu tun. Hat jemand anderes das durchgemacht?

Antwort

14

Sie können die params-Hash als

params = ActionController::Parameters.new(your_hash) 

Dies ist die Klasse, die Ihre URL params Stummel in Ihrem Controller umgewandelt werden, und es gibt Ihnen die erfordern und ermöglichen Methoden.

Ich persönlich extrahieren die funktional in eine neue Klasse, um die Autorisierung Politik zu behandeln.

0

Ich bin mir nicht sicher, ob ich strong_parameters testen würde, was ich vermute, dass Sie über the gem verwenden.

Das Juwel hat its own tests, also können wir davon ausgehen, dass es wie erwartet funktioniert.

Dies ist ein Beispiel für das Testen von Rails, das ich für unnötig halte. Ich würde nicht testen, dass attr_accessible funktioniert wie angepriesen (Testing Rails) oder attr_accessor (Testing Ruby).

IMHO, sollten Sie Ihre Integrationstests alle gewünschten Instanzen Erfolg/Misserfolg abdecken und implizit Ihre strong_parameter Konfiguration abdecken.

+3

Unsere Testrichtlinie Tests für alle Funktionen explizit zu schreiben ist, zu uns zu erlauben, potentiell wechseln Sie Edelsteine ​​/ rollen Sie unsere eigenen später und wissen Sie immer noch, dass das System funktioniert. – Bryce

+10

Sie können auch testen, ob Ihr Code, der in strong_parameters integriert ist, ordnungsgemäß funktioniert. Ich habe Felder, die beschreibbar/nicht beschreibbar sind, abhängig von Benutzerrollen/Berechtigungen, also muss ich testen, ob diese beiden Teile richtig integriert sind. – cpuguy83

+1

Nachdem ich eine App von Rails 1.1 zu 3.2 genommen habe (und jetzt für 4.0 vorbereite), kann ich Ihnen versichern, dass das Testen von Rails sehr notwendig ist. Etwas, das in einer Version von Rails in einer Richtung funktioniert, kann das Verhalten in einer anderen Version ändern. Zum Beispiel klonte ich Activecord-Datensätze mit der 'clone'-Methode, aber irgendwo zwischen 3.0 und 3.2 entschieden sie, dass' dup' stattdessen diese Funktionalität bereitstellen würde ... und das etwas anders. Dies wurde nicht gut beworben, aber es wurde schnell von meinen Tests erfasst. – sockmonk

5

ändern diese nach Ihrem Bedarf,

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 

oder andere alternative Lösung für dieses Problem ist:

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