2013-05-15 27 views
12

Sto usando la gemma strong_parameters nei miei controller, ma ho difficoltà a capire come testarlo.RSpec - Test dei parametri forti

Ecco un esempio di mio 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 

Voglio testare il metodo user_params per assicurarsi che sia correttamente filtrando coppie chiave/valore maligni, ma non riesce a capire come farlo. Qualcun altro ha attraversato questo?

risposta

14

È possibile stub l'hash params come

params = ActionController::Parameters.new(your_hash) 

Questa è la classe che i params URL vengono convertiti al controller, e ti dà i metodi richiedono e permettono.

Estraggo personalmente la funzionalità in una nuova classe per gestire la politica di autorizzazione.

0

Non sono sicuro di testare strong_parameters, che suppongo tu stia utilizzando tramite the gem.

La gemma ha its own tests, quindi possiamo presumere che funzioni come previsto.

Questo è un esempio di "test Rails", che ritengo non necessario. Non testerei che attr_accessible funzioni come pubblicizzato (Testing Rails) o attr_accessor (Testing Ruby).

IMHO, i test di integrazione devono coprire tutte le istanze desiderate di successo/fallimento e implicitamente coprire la configurazione di strong_parameter.

+3

La nostra politica di prova è quello di scrivere in modo esplicito i test per tutte le funzionalità, per permetterci di potenzialmente scambia le gemme/tira le nostre in seguito e sappi che il sistema funziona. – Bryce

+10

Si può anche verificare che il codice che si integra con strong_parameters funzioni correttamente. Ho campi che sono scrivibili/non scrivibili a seconda dei ruoli/permessi dell'utente, quindi ho bisogno di verificare che questi due pezzi si integrino correttamente. – cpuguy83

+1

Avendo preso un'app da Rails 1.1 a 3.2 (e ora sto preparando per 4.0), posso assicurarti che testare Rails è molto necessario. Qualcosa che ha funzionato in un modo in una versione di Rails può cambiare il comportamento in un'altra versione. Ad esempio, ho clonato i record di activerecord usando il metodo 'clone', ma da qualche parte tra 3.0 e 3.2 hanno deciso che' dup' avrebbe fornito quella funzionalità invece ... e lo avrebbe fatto in modo leggermente diverso. Questo non era ben pubblicizzato, ma è stato rapidamente catturato dai miei test. – sockmonk

5

Modificare questo secondo le vostre necessità,

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 

o altra soluzione alternativa a questo problema è:

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