2010-11-27 12 views
16

ile rspec ile özel bir Devise oturum denetleyicisini sınamaya çalışıyor. Benim denetleyicisi şöyle görünür:Özel Devise Oturum Denetleyicisinin RSpec Testi, AbstractController :: ActionNotFound

class SessionsController < Devise::SessionsController 

    def create 
    #valid email? 
    if !(params[:email] =~ /^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,}$/) 
     set_flash_message :notice, "Please enter a valid e-mail address!" 
    end 

    super 
    end 
end 

My RSpec Denetleyici Testi şudur:

require 'spec_helper' 
require 'devise/test_helpers' 

describe SessionsController do 

    it "should put a warning on invalid mail address login attempt" do 
    post :create, :user => {:email => 'invalidEmailAddress'} 
    response.should contain "Please enter a valid e-mail address!" 
    end 

    it "should put no warning on valid mail address login attempt" do 
    pending 
    end 
end 

ben RSpec Testi yürütmek Eğer aşağıdaki satırla başarısız: den

Failure/Error: post :new, :user => {:email => 'invalidEmailAddress'} 
    AbstractController::ActionNotFound 
    # ./spec/controllers/sessions_controller_spec.rb:7 

İpuçları Plataformatec Devise Wiki'nin yanı sıra this post bu sorunu çözmedi. Yardım ettiğin için teşekkür ederim.

Eklenen

I daha da incelendi. Ben kontrolör spec aşağıdaki eklenmesiyle hata "kaldır" aslında başardı:

before(:each) do 
    request.env['devise.mapping'] = Devise.mappings[:user] 
end 

Ama şimdi yeni bir hata ortaya çıkıyor:

oluşturmak yöntem miras dışarı bıraktı bile sahip
Failure/Error: post :create #currently fails with multiple render warning 
Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return". 

denetleyici hatası görüntülenir. Hata, get'de görünmüyor: örneğin yeni. Gönderi görünüyor: sadece yarat. Fikirlerim tükendi mi? Herhangi bir yardım? Teşekkürler!

cevap

18

Sonunda, sorun giderme test yardımcılarını da ekleyerek, benim testimde setup_controller_for_warden yöntemini çağırarak ve request.env ["devise.mapping"] = Devise.mappings [: user] işlemini yaparak problemimi çözdüm. Gibi:

require 'test_helper' 

class SessionsControllerTest < ActionController::TestCase 
    include Devise::TestHelpers 

    test "should reject invalid captcha" do 
     setup_controller_for_warden 
     request.env["devise.mapping"] = Devise.mappings[:user] 

     get :new 

     assert_response :success 
    end 
end 

Çift oluşturma sorununuzdan emin değil misiniz, postanızı çağırmak istediğinizden emin misiniz? Rspec'in nasıl çalışması gerektiğinden emin değilim.

+0

'render', görüntüleme özelliklerini kapsar - varsayılan olarak görünüm oluşturmayan denetleyici özelliklerinde anlam ifade etmez. Test denetleyicisinin işleme koymasını istiyorsanız, bir “render_views” yönergesi vardır (eski "integrate_views" yerine). – zetetic

+0

Tamam, haklısın. Ancak açık bir şekilde oluşturulmasa bile hata oluşur. Render eski koduma hiç ulaşmadı. – kaihowl

+0

Cevabınız için teşekkür ederiz. Önerilerinizi denedim, ama hiçbiri benim için işe yaramadı. Ne yazık ki, aynı hatalar tekrar tekrar ortaya çıkıyor. – kaihowl