2015-03-09 10 views
8

Ich simuliere eine Anfrage von einem externen Dienst, der kein Echtheitstoken haben wird. Ich möchte, dass der Test fehlschlägt, wenn skip_before_action :verify_authenticity_token fehlt.POST mit fehlenden authenticity_token in rspec rails Anfrage Test?

Wie mache ich das aus einer Rspec-Anforderungsspezifikation?

Momentan verwende ich post wie unten, aber es wird gerne angenommen.

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

Antwort

22

CSRF-Schutz disabled in test environment. Versuchen Sie es zu aktivieren:

before do 
    ActionController::Base.allow_forgery_protection = true 
end 

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

Ab Rails 4.2. 5.1 und Rspec 3.4, funktioniert diese Technik gut. Ich vermute, dass dies der richtige Weg ist, um die Lösung zu implementieren. –

+0

Das war wirklich hilfreich, danke. – Joseworks

+0

Für Tests des CSRF-Schutzes muss möglicherweise [der 'raise_error'-Matcher] (https://www.relishapp.com/rspec/rspec-expectations/v/3-5/docs/built-in-matchers/raise- error-matcher): 'expect {post-Endpunkt, my_json_string} .to raise_error (ActionController :: InvalidAuthenticityToken)'. Ich dachte, ich sollte den Rückgabecode überprüfen. –

1

Deaktivieren des CSRF-Schutzes funktionierte nicht für mich. Also habe ich diese Modul, das die Antworttext verwendet die Authentizität Token abzurufen:

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

Dann kann ich ohne deaktivieren Fälschungsschutz setzen/Post-Anfragen Test:

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