2010-10-07 72 views
4

我創建了一個定製的設計註冊控制器,我想用rspec來測試它。RSpec-2和設計

我一個非常簡單的測試試了一下:

it "creates a new parent" do 
    Parent.should receive(:new) 
    post :create 
end 

,但我得到這個異常:

Failures: 
    1) Parent::RegistrationsController POST create creates a new parent 
    Failure/Error: post :create, { :commit => "Daftar", 
    uncaught throw `warden' 
    # /home/starqle/.rvm/gems/ree-1.8.7-2010.02/gems/devise-1.1.3/lib/devise/hooks/timeoutable.rb:16:in `throw' 
    # /home/starqle/.rvm/gems/ree-1.8.7-2010.02/gems/devise-1.1.3/lib/devise/hooks/timeoutable.rb:16 

我已經把我的測試中這行:

describe Parent::RegistrationsController do 
    include Devise::TestHelpers 
end 

我也已經把這一行:

request.env["devise_mapping"] = Devise.mappings[:parent] 

有人有想法解決這個問題嗎?

+0

哦,還有一件事..只有當我在我的自定義控制器中使用sign_in方法時纔會發生...... – giosakti 2010-10-07 02:54:08

回答

5

我以前的回答有點混亂。抱歉。

更新回答:根本原因是用戶在「登錄」之前沒有「確認」。

@user.confirm! 
sign_in @user 

然後一切都很好。

+0

謝謝你,一種粗糙的方式,但它現在工作正常。 – giosakti 2010-10-18 05:14:01

+0

是的,這不是一個優雅的解決方案。我不知道Rails3是否遇到了這個問題。但是我確信在設計中有兩個sign_in方法: 1. sign_in(Devise :: Controllers :: Helpers) 2. sign_in(Devise :: TestHelpers) 他們使用不同的實現策略,只有第​​二種方法工作。我不知道這是否是一個錯誤,除非我有足夠的時間閱讀「warden」的源代碼。 這是我第一次接受StackOverflow的答案,謝謝! – 2010-10-19 05:38:01

+3

看來我找到了根本原因:@user應該在sign_in之前首先被確認。 @ user.confirm! sign_in(@user) – 2010-11-02 13:45:10

3

我是新鮮的紅寶石。 我用設計和工廠女孩的軌道3。

我正在尋找如何驗證rspec的用戶。

我被拖到了before_filter:authenticate_user!在控制器中。

最後我得到了解決(感謝四維沉) 我在做什麼是

  1. 包括規範TestHelpers/spec_helper.rb

2.

require 'spec_helper' 

describe StudentsController do 
    before(:each) do 
    @user = Factory.create(:user) #:user from factory girl with admin privilages 
    @request.env['devise.mapping'] = :user 
    @user.confirm! 
    sign_in @user 
    end 

    it "can get index of student" do 
    get :index 
    response.should be_suclogin_as @user 
    end 

    it "can create student" do 
    #in student model : validates :name, :presence=> true 
    post :create, :student => {name => "student1" } 
    answer = Student.find_by_name("student1") 
    answer.name.should == "student1" 
    end 
end