【问题标题】:undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x1057fd428> error while trying to set up RSpec with Devise尝试使用 Devise 设置 RSpec 时出现 #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x1057fd428> 错误的未定义方法“sign_in”
【发布时间】:2011-08-21 23:11:10
【问题描述】:

我有一个spec/controllers/add_to_carts_spec.rb

require 'spec_helper'

describe CartItemsController do

  before (:each) do
    @user = Factory(:user)
    sign_in @user
  end

  describe "add stuff to the cart" do
    it "should add a product to the cart" do
      product = FactoryGirl.create(:product)
      visit products_path(product)
      save_and_open_page
      click_on('cart_item_submit')
    end
  end

end

/spec/support/spec_helper.rb:

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rspec'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.mock_with :rspec
  config.use_transactional_fixtures = true
end

... 也加载了/spec/support/devise.rb:

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

Guard 在后台运行并不断抛出这个:

Failures:

  1) CartItemsController add stuff to the cart should add a product to the cart
     Failure/Error: sign_in @user
     NoMethodError:
       undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x1057fd428>
     # ./spec/controllers/add_to_carts_spec.rb:7

过去几个小时我尝试了各种配置调整和不同的语法,但似乎没有任何改变。有什么想法吗?

(已编辑以反映较新的错误)

【问题讨论】:

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


    【解决方案1】:

    理想的解决方案是在 spec/support/devise.rb 创建一个文件,并通过以下代码在 Rspec 配置中包含设计测试助手:

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

    type 参数仅在您的控制器规范中包含帮助器,这是为了避免将来在测试模型或视图时调用它时可能出现的问题。这是可选的。

    我们决定添加一个包含帮助器的离散文件,而不是像上面 solnic 那样将它们包含在规范中的原因是,如果重新生成规范,规范将被覆盖。

    【讨论】:

    • 这个答案没有赞成票(除了我自己的)并且效果很好。不要忽视这是一个可能的解决方案。
    • 虽然这是包含这些助手的正确方法,但原始发布者已经在使用这种方法但没有成功。这是对不同问题的正确答案。
    • 关于:type 参数的部分是这个问题让我有些头疼的地方。在有关测试的设计文档中没有很清楚地记录。
    【解决方案2】:

    由于某种原因,这对我也不起作用,所以我只是手动将这个助手包含在我的规范中,如下所示:

    describe CartItemsController do
      include Devise::TestHelpers
    
      # ...
    end
    

    【讨论】:

      【解决方案3】:

      那些测试助手不适用于集成/请求规范。在这些情况下测试 Devise 的推荐方法是访问登录页面,填写表单并提交,然后运行测试。

      请参阅David Chelimsky's answer 以获取有关此主题的先前 SO 问题以获得更完整的解释。

      【讨论】:

      • 谢谢,你是对的。我混淆了两种规格。我正在使用 capybara 访问页面并因此使用它的会话机制,但尝试像在控制器规范中那样登录用户。 capybara 不使用或访问这些内容。
      猜你喜欢
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多