RSpec和设计:无法签署管理员

时间:2012-03-06 09:36:05

标签: rspec devise

我正在将我的标准Rails单元测试迁移到RSpec,我遇到了设计问题。包含设计认证的所有控制器都失败了RSpec。

我尝试按照设计教程在RSpec中签署一个管理员,但没有成功:

https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3-(and-rspec)

这是我试过的:

/spec/controllers/ipad_tech_infos_controller_spec.rb

before :each do
    @request.env["devise.mapping"] = Devise.mappings[:admin]
    @admin = FactoryGirl.create :admin
    sign_in @admin
end

/spec/support/devise.rb

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

/spec/factories/admin.rb

FactoryGirl.define do
  factory :admin do
    email "abc@abc.com"
    password "foobar"
    password_confirmation {|u| u.password}
  end
end

我的模型无法确认,我的所有控制器规格都失败了。

如果我删除before_filter:authenticate_admin!然后我的所有考试都通过了。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:21)

可能是罪魁祸首:确保您未在​​控制器规范中明确设置会话。

例如,如果您使用默认的Rspec脚手架生成器,则生成的控制器规范会传递会话参数。

get :index, {}, valid_session

这些会覆盖Devise的助手设置为使用Warden登录的会话变量。最简单的解决方案是删除它们:

get :index, {}

或者,您可以手动设置Warden会话信息,而不是使用Devise的助手。

答案 1 :(得分:3)

你说“我的模型不可确认”所以以下内容并不适用于你,但这里有一些其他人可能会错过的精妙内容,就像我一样(浪费了一个小时)。

请注意vdaubry上面提到的RSpec / Devise How-To,它说如果您的模型中启用了Devise“确认”模块,那么您需要在{{1}之前调用@admin.confirm!或者,或者确保您的工厂在创建sign_in @admin时设置confirmed_at。如果您不这样做,@admin调用将无声地失败,所有后续规范将表现得像您没有登录。

答案 2 :(得分:1)

我不知道造成这种情况的原因,但对我来说,解决办法是添加方法:

def valid_session
  {"warden.user.user.key" => session["warden.user.user.key"]}
end

在这里找到: rail3/rspec/devise: rspec controller test fails unless I add a dummy=subject.current_user.inspect