【问题标题】:rspec & devise test helpersrspec & 设计测试助手
【发布时间】:2011-06-19 16:33:30
【问题描述】:

根据设计 wiki 中的this,我应该能够在我的控制器测试中使用 login_user 辅助方法。因此,我在规范目录中有以下内容:

#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.7 rspec 2.6.0 设计 1.3.4

backtrace

【问题讨论】:

  • 这是您的 some_spec.rb 中的错字吗? log_in / login_user
  • 你得到的回溯是什么?
  • 嗨。已添加到问题的脚下。
  • 等等——回溯是说它找不到你的 login_user 方法。我不知道“controller_macros.rb”是什么...但是尝试将其直接放入 spec_helper.rb 以查看 login_user 是否确实有效...然后弄清楚如何包含 ControllerMacros 以便它可以找到你的辅助方法。

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


【解决方案1】:

我想这种方法存在一些问题。首先是您使用的是请求规范,而不是控制器规范,因此config.extend ControllerMacros, :type => :controller 无法使用login_user 方法。其次,即使您能够包含该方法,它也很可能无论如何都不起作用,因为 Devise 测试助手是专门为控制器/视图测试而不是集成测试编写的。

看看 David Chelimsky 的 answerthis SO question,这可能会有所帮助。

【讨论】:

  • 感谢 zetetic。你是完全正确的,我混淆了控制器和请求规范。链接的答案完美无缺。
  • 如何在规范中注销已登录的会话。
【解决方案2】:

我不能肯定地回答......但对我来说,代码味道是在帮助程序中定义的“之前(:每个)”。为什么不试试呢:

#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 中获得的不同 ...看起来和我很相似。

【讨论】:

  • 感谢您的回答。我试过了,但总是缺少方法变量/错误,这似乎表明该模块根本不包括在内。
  • 嗯-抱歉-我将它与 Test::Unit 一起使用(尽管我在另一个项目中使用 rspec),所以我只是在猜测...也许您可能需要 spec_helper.rb 中的“设计” ?
  • 嗨,泰伦。感谢您的建议,但看起来我确实混淆了控制器规格和请求规格。
【解决方案3】:

我的控制器规格上的 Rails 3.0.10 rspec 2.6.0 设计 1.3.4 spork-0.9.0.rc9 有同样的问题,我已将 config. extend 更改为 config.include 及其工作!

【讨论】:

    【解决方案4】:

    如果您的应用不可确认,请忘记确认。你的代码应该看起来像

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多