【问题标题】:RSpec-2 and DeviseRSpec-2 和设计
【发布时间】:2010-10-07 02:52:20
【问题描述】:

我创建了一个定制的设计注册控制器,我想用 rspec 对其进行测试。

我已经通过一个非常简单的测试进行了尝试:

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]

有人有解决这个问题的想法吗?

【问题讨论】:

  • 哦,还有一件事..只有当我在自定义控制器中使用登录方法时才会发生这种情况..

标签: ruby-on-rails ruby-on-rails-3 rspec devise rspec2


【解决方案1】:

我之前的回答有点混乱。对不起。

更新答案:根本原因是用户在“登录”之前未“确认”。

@user.confirm! 
sign_in @user

那么一切都很好。

【讨论】:

  • 是的,这不是一个优雅的解决方案。我不知道 Rails3 的人是否遇到过这个问题。但是我确信 devise 中有 2 个 sign_in 方法:1. sign_in (Devise::Controllers::Helpers) 2. sign_in (Devise::TestHelpers) 他们使用了不同的实现策略,只有第​​ 2 个方法有效。我不知道这是否是一个错误,除非我有足够的时间阅读“warden”的源代码。这是我在 StackOverflow 上第一个接受的答案,谢谢!
  • 看来我找到了根本原因:@user 首先应该在sign_in 之前确认。 @user.confirm!登录(@user)
  • 四维你ROCK!谢谢你,谢谢你,谢谢你。我一直在寻找类似问题的解决方案几个小时,而在sign_in @user 之前的@user.confirm! 正是我所缺少的。
【解决方案2】:

我对红宝石更感兴趣。 我正在使用带有设计和工厂女孩的 rails 3。

我正在寻找如何为 rspec 验证用户。

我被困在 before_filter: authenticate_user!在控制器中。

终于找到了解决办法(感谢沉思伟) 我正在做的是

  1. 在 spec/spec_helper.rb 中包含 TestHelpers

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多