2015-03-09 17 views
8

Sto simulando una richiesta proveniente da un servizio esterno, che non avrà un token di autenticità. Voglio che il test fallisca se manca skip_before_action :verify_authenticity_token.Come POST con autenticità mancante nel test della richiesta di rails rspec?

Come si esegue questa operazione da una specifica di richiesta Rspec?

Attualmente sto usando post come di seguito, ma è felicemente accettato.

post endpoint, my_json_string, {'CONTENT_TYPE' => "application/json"} 

risposta

22

protezione CSRF disabled in test environment. Prova ad abilitarlo:

before do 
    ActionController::Base.allow_forgery_protection = true 
end 

after do 
    ActionController::Base.allow_forgery_protection = false 
end 
+1

Come di Rails 4.2. 5.1 e Rspec 3.4, questa tecnica funziona bene. Sospetto che questo sia il modo corretto per implementare la soluzione. –

+0

Questo è stato davvero utile, grazie. – Joseworks

+0

Per i test di protezione CSRF, potrebbe essere necessario [il rilevatore 'raise_error'] (https://www.relishapp.com/rspec/rspec-expectations/v/3-5/docs/built-in-matchers/raise- error-matcher): 'expect {post endpoint, my_json_string} .to a raise_error (ActionController :: InvalidAuthenticityToken)'. Ho pensato che dovevo controllare il codice di risposta della risposta. –

1

La disattivazione della protezione CSRF non ha funzionato per me. Così ho creato questo modulo che utilizza il corpo di risposta per recuperare il token di autenticità:

https://gist.github.com/Rodrigora/440220a2e24bd42b7b0c

Poi, posso messo prova richieste/post senza disabilitare la protezione contraffazione:

before do 
    @token = login(create(:user, password: 'password')) 
end 

it 'tests model creation' do 
    expect { 
    post_with_token 'path/to/model', model_params, @token 
    }.to change(Model, :count).by(1) 
end 
Problemi correlati