7

Tengo una aplicación rails3 que usa protect_from_forgery en mi controlador de aplicación base. Estoy usando ActionDispatch::IntegrationTest y quiero asegurarme de que los tokens de autenticidad estén presentes durante ciertas pruebas de integración.Reemplazar action_controller.allow_forgery_protection para la prueba de integración específica

no quiero cada prueba funcional que ejecuta un post a tener que pasar la authenticity_token, por lo que mi archivo test.rb especifica:

config.action_controller.allow_forgery_protection = false 

como los carriles de documentos sugieren.

Para las pruebas de integración, sin embargo, me gustaría asegurarme de que mis formularios envían correctamente el token de autenticidad. No puedo encontrar ninguna manera de hacer esto sin cambiar la configuración a nivel mundial en config/environments/test.rb

Si todos mis formas se generaron con form_for estaría contenido que confiar en que los carriles se ocupa de esto, pero yo uso ExtJS y tienen un número de formas ExtJS que necesita especificar esto manualmente, así que realmente debería probar que la tubería está funcionando.

Respuesta

7

Usted puede simplemente cambiar el valor en la configuración de prueba de integración:

require 'test_helper' 

class MyCrunchyIntegrationTest < ActionController::IntegrationTest 
    fixtures :all 

    def setup 
    ActionController::Base.allow_forgery_protection = true 
    end 

    def teardown 
    ActionController::Base.allow_forgery_protection = false 
    end 

    test "how awesome my application is" do 
    # ... 
    end 
end 
+1

Pero esto no restablece para la próxima prueba! La respuesta de IMM gmcnaughton es mejor. –

+1

Es cierto. Editado para restablecer el valor en el método 'desmontaje '. Sin embargo, el uso de un bloque como se sugirió @gmcnaughton puede ser mejor para un control más granular. –

7
método

ayudante que permite temporalmente la protección de falsificación de un bloque:

def with_forgery_protection 
    orig = ActionController::Base.allow_forgery_protection 
    begin 
    ActionController::Base.allow_forgery_protection = true 
    yield if block_given? 
    ensure 
    ActionController::Base.allow_forgery_protection = orig 
    end 
end 

with_forgery_protection do 
    # code in here will require csrf token 
end 
1

Ésta es una versión RSpec de solución de @ gmcnaughton .

Esto va en spec_helper.rb:

RSpec.configure do |config| 
    config.around(:each, :with_csrf_protection) do |example| 
    orig = ActionController::Base.allow_forgery_protection 

    begin 
     ActionController::Base.allow_forgery_protection = true 
     example.run 
    ensure 
     ActionController::Base.allow_forgery_protection = orig 
    end 
    end 
end 

A continuación, se escriben las pruebas como:

it "foo", with_csrf_protection: true do 
    # … 
end 

O, dependiendo de la configuración RSpec:

it "foo", :with_csrf_protection do 
    # … 
end 
Cuestiones relacionadas