2010-10-07 66 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