7

Temel uygulama denetleyicimde protect_from_forgery kullanan bir rails3 uygulaması var. ActionDispatch::IntegrationTest kullanıyorum ve belirli tümleştirme testleri sırasında özgünlük belirteçlerinin bulunduğundan emin olmak istiyorum. Benim test.rb dosya belirtir böyleceBelirli bir bütünleştirme testi için action_controller.allow_forgery_protection geçersiz kılma

Ben, bir authenticity_token kaçırmak zorunda bir yazı yürütür her fonksiyonel testi istemiyoruz: docs önermek raylar olarak

config.action_controller.allow_forgery_protection = false 

. Ancak, tümleştirme sınamaları için formlarımın özgünlük belirtecini düzgün bir şekilde gönderdiğinden emin olmak isterim. Ben bütün formları form_for ile oluşturulan olsaydı bu işleme raylar güven içerik olurdu config/environments/test.rb

dünya çapında ayarını değiştirmeden bunu yapmak için herhangi bir şekilde bulamıyor ama ExtJS kullanmak ve ExtJS Formlar bir dizi var Bunu manuel olarak belirtmem gerekiyor, bu yüzden sıhhi tesisatın çalıştığını test etmeliyim.

cevap

7

Siz sadece entegrasyon testi kurulumunda değerini değiştirebilirsiniz:

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 
bir blok için geçici olarak sahtecilik koruması sağlayan
+1

Ama bu sıfırlanmaz Bir sonraki test için! IMO gmcnaughton'un cevabı daha iyi. –

+1

Doğru. 'Teardown' yöntemindeki değeri sıfırlamak için düzenlenmiştir. Bununla birlikte, bir bloğun @gmcnaughton olarak kullanılması, daha ayrıntılı bir kontrol için daha iyi olabilir. –

7

Yardımcısı yöntemi:

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

Bu @ gmcnaughton çözümünü uygun bir RSpec versiyonudur .

Bu

spec_helper.rb gider:

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 

Sonra gibi testleri yazmak:

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

Veya, RSpec ayarlarına bağlı olarak:

it "foo", :with_csrf_protection do 
    # … 
end