NoMethodError: RSpec::ExampleGroups::ApplicationsController类没有定义'setup'方法

5
寻找这个问题的解决方案只能找到其他人处理过的特定宝石或类的问题。在我的情况下,我认为rspec总体上存在问题。
每当我使用rails generate ControllerName生成一个控制器时,它会设置好一切,似乎一切正常。我路由了几个控制器并在开发和生产中进行了测试,一切正常。
唯一似乎出现问题的是使用rspec进行测试。现在我项目中有两个控制器,每当我运行rspec/spec时,大多数由rails g生成的规范都会出现此错误:
NoMethodError:
  undefined method `setup' for RSpec::ExampleGroups::MoreStuffHere

例如,我有一个WelcomeController和一个ApplicationsController,这些是我一直遇到的错误:
undefined method `setup' for RSpec::ExampleGroups::ApplicationsController:Class
undefined method `setup' for RSpec::ExampleGroups::WelcomeController:Class
undefined method `setup' for RSpec::ExampleGroups::WelcomeAboutHtmlErb:Class
undefined method `setup' for RSpec::ExampleGroups::WelcomeIndexHtmlErb:Class

有趣的是,我没有收到他们的helper_spec的错误提示。

以下是完整的错误信息:

在加载./spec/controllers/applications_controller_spec.rb时发生错误。

Failure/Error:
  RSpec.describe ApplicationsController, type: :controller do

  end

NoMethodError:
  undefined method `setup' for RSpec::ExampleGroups::ApplicationsController:Class
# ./spec/controllers/applications_controller_spec.rb:3:in `<top (required)>'

有人知道这个问题出在哪里吗?


这个有任何消息吗? :/ - tpei
我的回答没有解决你的问题吗? - Damian Rivas
很遗憾,不是的 :( - tpei
2个回答

3
spec_helper.rb文件中,我有以下内容:
require File.expand_path("../../config/environment", __FILE__)
require 'rails/all'

RSpec.configure do |config|
  # More code here.
end

我只需要在require 'rails/all'下添加require 'rspec/rails'即可解决我的问题。
然而,我不知道为什么。如果有人能详细说明一下,那就太好了。在rails_helper.rb中,我已经添加了require 'rspec/rails',但显然这还不够。

2

在我看来,这里的解决方案与Damian Rivas所说的有些相似,但重要的是:

  • 在rails助手中,你有一行代码:

require 'spec_helper'

  • 在spec_helper中,你需要在config块中包含devise helpers的代码行:

config.include Devise::Test::ControllerHelpers, type: :controller

  • 正如上面所说,你还需要有rspec/rails的引用行

主要的观点是你必须注意这里的顺序...始终包括rspec/rails必须放在spec_helper之前。

所以,假设spec_helper.rb的示例代码如下:

require 'rubygems'

Rspec.configure do |config|
  config.include Devise::Test::ControllerHelpers, type: :controller
end

那么我们的rails_helper.rb应该长这样:
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
abort('The Rails environment is running in production mode!') if Rails.env.production?

require 'rspec/rails'
require 'spec_helper'

sample_spec.rb中,你需要引入rails_helper,或者像我一样通过.rspec进行引入,这样就不必在每个spec文件的开头都要引入了。
希望对大家有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接