RSpec和designe:无法在admin中登录

RSpec和designe:无法在admin中登录,rspec,devise,Rspec,Devise,我正在将我的standart-Rails单元测试迁移到RSpec,我在designe上遇到了问题。所有包含设备身份验证的控制器都无法通过RSpec进行验证 我尝试在RSpec中的管理员中按照设计教程进行签名,但没有成功: 以下是我尝试过的: /规格/控制器/ipad\u技术\u信息\u控制器\u规格rb before :each do @request.env["devise.mapping"] = Devise.mappings[:admin] @admin = Factor

我正在将我的standart-Rails单元测试迁移到RSpec,我在designe上遇到了问题。所有包含设备身份验证的控制器都无法通过RSpec进行验证

我尝试在RSpec中的管理员中按照设计教程进行签名,但没有成功:

以下是我尝试过的:

/规格/控制器/ipad\u技术\u信息\u控制器\u规格rb

before :each do
    @request.env["devise.mapping"] = Devise.mappings[:admin]
    @admin = FactoryGirl.create :admin
    sign_in @admin
end
/spec/support/designe.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
我的型号不可确认,我所有的控制器规格都不合格

如果我删除之前的过滤器:验证管理员!然后我所有的测试都通过了


有人能帮忙吗?

可能的罪魁祸首:确保您没有在控制器规格中明确设置会话

例如,如果您使用的是默认的Rspec scaffold生成器,则生成的控制器规范将传递会话参数

get :index, {}, valid_session
这些正在覆盖Desive的助手设置为与典狱长登录的会话变量。最简单的解决方案是删除它们:

get :index, {}
或者,您可以手动设置其中的典狱长会话信息,而不是使用Deavie的助手。

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


请注意,在上面提到的RSpec/设计方法中,它说如果您的模型中启用了设计“可确认”模块,则您需要致电
@admin.confirm就在
登录@admin
之前,或者确保您的工厂在创建
@admin
时将
确认设置为
。如果您不这样做,
登录
调用将自动失败,所有后续规范将表现为您未登录。

我不知道这是什么原因,但对我来说,解决方案是添加以下方法:

def valid_session
  {"warden.user.user.key" => session["warden.user.user.key"]}
end
可在此处找到:

此外,如果你的管理员嵌套在用户工厂中,你需要这样称呼它:
登录:user,@admin
,这意味着
登录(范围、资源)
添加配置。包括design::Test::ControllerHelpers,type::controller到rails\u helper.rb,它对我很有效