根据设计wiki的这一点,我应该能够在控制器测试中使用login_user-helper方法。因此,我在规范目录中有以下内容:
#spec_helper.rb
...
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller
...
和
#support/controller_macros.rb
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
@user = Factory.create(:user)
sign_in @user
end
end
end
但是调用助手不起作用:
#requests/some_spec.rb
require 'spec_helper'
describe "GET /guides/edit" do
login_user
end
有人能指出我哪里错了吗。测试套件就是这样工作的。我得到一个未定义的局部变量或方法消息,所以我想模块没有被包括在内。
轨道3.0.7rspec 2.6.0设计1.3.4
回溯
我想这种方法有几个问题。首先,您使用的是请求规范,而不是控制器规范,因此config.extend ControllerMacros, :type => :controller
无法使用login_user
方法。其次,即使您能够包含方法,它也很可能无论如何都不起作用,因为Devise测试助手是专门为控制器/视图测试而写的,而不是集成测试。
看看David Chelimsky对这个SO问题的回答,这可能会有所帮助。
我不能肯定地回答。。。但对我来说,代码气味是在助手内部定义的"before(:each)"。你为什么不试试:
#support/controller_macros.rb
module ControllerMacros
def login_user
@request.env["devise.mapping"] = Devise.mappings[:user]
@user = Factory.create(:user)
sign_in @user
end
end
和
#requests/some_spec.rb
require 'spec_helper'
describe "GET /guides/edit" do
before(:each) do
login_user
end
end
如果失败了——也许它就是找不到@request——在这种情况下,将其作为变量传递给login_user
编辑:
看起来您可能需要包括设计测试助手。rdoc说你应该有这个文件:
# spec/support/devise.rb
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
end
不确定这是否与您在spec_helper.rb中已经获得的不同…看起来和我很像。
在我的控制器规格上,我对Rails 3.0.10 rspec 2.6.0 design 1.3.4 spork-0.9.0.rc9有同样的问题,我已经将config. extend
更改为config.include
及其工作!
忘记确认您的应用程序是否不可确认。你的代码应该看起来像
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = FactoryGirl.create(:user)
#user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module
sign_in user
end
end
end