2012-06-22 15 views
7

Yeni işlemin görüntülenmek üzere bir kullanıcının oturum açmasını gerektirdiği bir kaynağa sahibim. Bir kullanıcı giriş yapmadan yeni bir kaynak oluşturmaya çalışırsa, giriş sayfasına yeniden yönlendirilir (302'd). Benim fonksiyonel testi şöyle görünür: Yeni eylemden önce authenticate_user bir before_filter varİşlevsel kimlik doğrulaması için kimlik doğrulama_kullanıcısı için devredışı belirleme hatası Raylar testi

ArgumentError: uncaught throw :warden 
    /.../gems/warden-1.1.1/lib/warden/proxy.rb:114:in `throw' 
    /.../gems/ruby-1.9.2-p318/gems/warden-1.1.1/lib/warden/proxy.rb:114:in `authenticate!' 
    /.../gems/ruby-1.9.2-p318/gems/devise-2.0.4/lib/devise/controllers/helpers.rb:48:in `authenticate_user!' 

:

test "should not get new unless logged in" do 
    get :new 
    assert_response :redirect 
    end 

StackTrace şuna benzer.

Neden authenticate_user anlıyorum! başarısız oluyor ama neden bir hata attığını anlayamıyorum. Sadece webapp'ta olduğu gibi davranmaması gerekir. kullanıcıyı giriş sayfasına yönlendirir?

Teşekkürler.

+0

Kullanıcının oturum açmadığı bir vakayı test etmenin bir yolunu buldunuz mu? Benzer bir sorun yaşıyorum. –

+1

Nihayet bu çalışmayı nasıl gerçekleştirdiğimi bilmiyorum ama test sınıfına 'Devise :: TestHelpers'ı eklemek de söz konusu olabilir.Kodunuzla bir macun eklemekten çekinmeyin ve bir göz atmaya çalışacağım. Benim durumumda – Ger

+0

Bu özellik bildirimi içinde bir js: true 'olduğu ortaya çıktı (ki ihtiyacım yoktu ve bir şekilde bu hataya neden oldu) – xxjjnn

cevap

0

Bu artık eski bir soru olduğunu biliyorum ama Devise wiki'nin cevap buldu

Bu adım ancak burada yeniden oluşturmak için çok involde olan kılavuz, ilk bir adım vardır https://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara

adım, bu bu olur

+1

Bir kullanıcı içine bağlı ekstra mantık olduğunda bu bana oldu (onlar ihtiyaç vardı Benim Devise sorunları radarında gelmedi bir yönetici tarafından onaylanması için). Dolayısıyla, bir kullanıcı geçerli olsa bile, sayfayı görebilmek için tüm doğru işaretlere/izinlere sahip olduklarından emin olun. – Danny

+0

Yukarıdaki cevabımı görün. Warden.test_reset'i de dahil etmek istersiniz! Teardown işlevinizde, testlerinizin sonunda herhangi bir değişikliği geri almak için. Aksi halde, bir test vakasında gerçekleştirilen herhangi bir müdür eylemi (örneğin, giriş yapma) bir sonraki aşamaya akacaktır. – xeorem

2

yardımcı Warden testi yardımcıları

include Warden::Test::Helpers 
Warden.test_mode! 

Umut dahil etmek olduğunda müdür ve/veya Dev Dahil olanlar eksik veya uygun yere eklenmez. Bunları test_helper.rb'ye eklemek cazip gelebilir çünkü burada yardımcılar tipik olarak gider ama bu Devise için uygun şekilde çalışmayacaktır.

Daha fazla ayrıntı için https://github.com/plataformatec/devise/issues/1029 adresine bakın.

require 'test_helper'         
class UserControllerTest < ActionController::TestCase 
    include Devise::TestHelpers       
    include Warden::Test::Helpers       
    Warden.test_mode!          

    def teardown           
    Warden.test_reset!         
    end             

    # test "the truth" do        
    # assert true 
    # end 
end 

Bu hazırlamak en kimlik doğrulaması kullanan her denetleyicisi için gereklidir:

Bu sorunu çözmek için, Devise yardımcı ve bunun gibi kontrolörün testi sınıfında Warden yardımcı ikisini de içerir.

DÜZENLEME: rails_helper.rb için spec_helper.rb (veya test_helper.rb) den include Warden:TestHelpers hareketli, aşağıda yorum belirtildiği gibi çok çalışır. documentation olarak

+3

Her sınıfa yardımcıları eklemeniz gerekmez. Aşağıdakileri test_helper'ınıza ekleyebilirsin: 'class ActionController :: TestCase include Devise :: TestHelpers şunları içerir: Warden :: Test :: Helpers end' (düzgün boşluk eksikliğinden dolayı özür dilerim) – sbleon

+1

Sizin" cevabınız " hiç çalışmak. Üzgünüz, ancak kontrol cihazınıza tüm dağınıklığı dahil etmek gerçekten uygun bir cevap değildir. – wegginho

+2

Bu nedenle bu problemi yaşadım ve 'config.include Devise :: TestHelpers' işlevini 'spec_helper.rb'den' rails_helper.rb''ye taşıyarak çözdüm (modülü daha sonra zincir içerisine dahil ederek). –

1

Bu hatayı aldım, ancak benim include Devise::TestHelpers sınıf tanımımın dışına koyduğumdan kaynaklanıyordu.

require 'test_helper' 
include Devise::TestHelpers 

class Admin::ObservationsControllerTest < ActionController::TestCase 
    setup do 
    ... 

Bu, 7 test vakasından 3'ü için müdür hatasını attı. include'un sınıf tanımı içinde taşınması her şeyi sabitledi.

İlgili konular