2014-06-18 6 views
10

Quelle est la stratégie actuelle pour tester le filtrage des paramètres forts dans le contrôleur Rails avec Rspec? (Excepté les allumettes shoulda) Comment écrire un test qui échoue et le rendre vert?Comment tester les paramètres forts avec Rspec?

+0

Est-ce que ma réponse a aidé? Peut-être que je peux clarifier quelque chose. – zishe

+0

Merci, vous m'avez vraiment aidé. Je ne savais pas à propos de with_indifferent_access. Et comment tester les exigences d'attributs, comme params.require: user? – Molfar

Répondre

9

Créer 2 hachages avec les paramètres attendus et tous (avec insatisfaits). Passez ensuite tous les paramètres à l'action et vérifiez que le modèle objet ne reçoit que les paramètres attendus. Ce ne sera pas si vous n'utilisez pas de filtres de paramètres forts. Ajoutez des autorisations aux paramètres et vérifiez à nouveau le test.

Par exemple, ceci:

# action 
def create 
    User.create(params) 
end 

# spec 
it 'creates a user' do 
    expect_any_instance_of(User).to receive(:create). 
    with({name: 'Sideshow Bob'}.with_indifferent_access) 
    post :create, user: 
    { first_name: 'Sideshow', last_name: 'Bob', name: 'Sideshow Bob' } 
end 

passera tous les params à l'utilisateur et test échouera. Et quand vous les filtrer:

def user_params 
    params.require(:user).permit(:name) 
end 

et de l'action de changement avec User.create(user_params), le test passera.

+2

'create' est une méthode de niveau classe définie sur' ActiveRecord :: Base' et héritée par 'User'. Donc, alors que 'expect_any_instance (User)' (attente fictive sur une instance de 'User') _might_ work,' expect (User) '(attente fictive sur la classe' User') fonctionnera aussi bien et est plus minimal. – dleve123

2

Voici comment je l'ai fait:

describe 'Safe Params' do 

    let(:mixed_params) { 
    { 
     blueprint_application_environment: { 
     id: 1000, 
     blueprint_id: 1, 
     application_id: 2, 
     environment_id: 3 
     }, 
     format: :json 
    } 
    } 

context "when processing a Post request with a mix of permitted and unpermitted parameters" do 
    before { post :create, mixed_params } 

    it "a create will not set the value of the unpermitted parameter" do 
    expect(JSON.parse(response.body)["id"]).not_to eq(1000) 
    end 

    it "a create will set the value of the permitted parameters" do 
    expect(JSON.parse(response.body)["blueprint_id"]).to eq(1) 
    expect(JSON.parse(response.body)["application_id"]).to eq(2) 
    expect(JSON.parse(response.body)["environment_id"]).to eq(3) 
    end 
end 

fin

code contrôleur:

def create 
    @blueprint_application_environment = BlueprintApplicationEnvironment.new(blueprint_application_environment_params) 
    if @blueprint_application_environment.save 
     render 'show.json.jbuilder' 
    else 
     render json: @blueprint_application_environment.errors, status: :unprocessable_entity 
    end 
    end 

def blueprint_application_environment_params 
    params.require(:blueprint_application_environment).permit(:blueprint_id, :application_id, :environment_id) 
end 
7

J'utilise personnellement shoulda-matcher de thoughtbot.

Avec quelque chose comme:

it do 
    should permit(:first_name, :last_name, :email, :password). 
    for(:update, params: params) 
end 
1

comme comme vous créez ou objet de mise à jour à l'aide des paramètres forts, il est également similaire, sauf une chose que normale vous comme ceci:

message: créer, book_id: @ book.id

Mais fort paramètre que vous devez faire comme ceci:

message: créer, {book_id: @ book.id, commentaire: {user_id: 101, book_id: @ book.id, description: "vaut la peine d'acheter"}}

vous avez transmettre des paramètres imbriqués.

Questions connexes