【问题标题】:Message: Failure/Error: require File.expand_path('../../config/environment', __FILE__)消息:失败/错误:需要 File.expand_path('../../config/environment', __FILE__)
【发布时间】:2019-03-24 13:21:37
【问题描述】:

首先我阅读了有类似问题的用户的其他帖子,但无法找出我的错误所在。我想用 RSpec 对以下文件进行测试:

dashboard_view_spec.rb:

require 'rails_helper'

RSpec.feature "Dashboard", type: :feature do 
before(:each) do
@current_user = User.create!(email: "xyz@xyz.com", password: "xyz123")
sign_in_with(@current_user.email,@current_user.password)
end

#NAV BAR RSPEC TEST
scenario 'Home bar nav link present' do
visit "/"
expect(page).to have_text('Home')
end

scenario 'How it work nav bar link present' do
visit "/"
expect(page).to have_text('How it work')
end

scenario 'Support nav bar link present' do
visit "/"
expect(page).to have_text('Support')
end

end

在顶部的 rails_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__)
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if   Rails.env.production?

require 'rake'
require 'spec_helper'
require 'rspec/rails'
require 'shoulda/matchers'
require 'capybara/rails'
require 'capybara/rspec'
require 'rspec/retry'
require 'devise'

错误信息:

Failure/Error: require File.expand_path('../../config/environment', __FILE__)

NoMethodError:
undefined method `[]' for nil:NilClass
# ./config/initializers/devise.rb:258:in `block in <top (required)>'
# ./config/initializers/devise.rb:5:in `<top (required)>'
# ./config/environment.rb:5:in `<top (required)>'
# ./spec/rails_helper.rb:4:in `require'
# ./spec/rails_helper.rb:4:in `<top (required)>'
# ./spec/views/dashboard_view_spec.rb:1:in `require'
# ./spec/views/dashboard_view_spec.rb:1:in `<top (required)>'
No examples found.

Randomized with seed 14549

然后是我在终端上使用的命令

 bundle exec rspec spec/views/dashboard_view_spec.rb

在观看了使用 Devise 进行测试的文档后,我更改了 dashboard_view_spec.rb 中的代码,并习惯于以 user 身份sign_in 并获得了同样的错误信息。

devise.rb 的第 258 行

 config.omniauth :facebook, Rails.application.secrets.facebook[:key],  Rails.application.secrets.facebook[:secret], scope: 'email', info_fields: 'email, name'

在宝石文件中

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger     console
 gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
 # Adds support for Capybara system testing and selenium driver
 gem 'capybara', '~> 2.13'
 gem 'selenium-webdriver'
 gem 'rspec-rails', '~> 3.8'
 gem 'factory_girl_rails'
 gem 'faker'
 gem 'database_cleaner'
end

group :development do
# Access an IRB console on exception pages or by using <%= console %>    anywhere in the code.
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
# Spring speeds up development by keeping your application running in the  background. Read more: https://github.com/rails/spring
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end

【问题讨论】:

  • 你能添加完整的堆栈跟踪和执行的命令吗?
  • 我添加了命令。错误的输出上没有堆栈跟踪。我截图了终端的错误信息。
  • 我改了。希望现在更好。感谢您的提示!
  • 您还没有发布 config/initializers/devise.rb:258 中的内容。错误消息非常简单:第 258 行的某些内容试图在一个对象上执行 [],该对象预期是 Array,但实际上是 nil。找到那个对象,找出它为什么是nil 而不是Array,然后修复它。很可能它引用了在您的 development 环境中定义的内容,而不是您的 test 环境中定义的内容,这就是您在 test 环境中出现此错误的原因。对测试的其余部分进行更改并不重要 - 在您的规范运行之前,它在 第 1 行 上失败了。
  • 我在开始的帖子中添加了这一行。

标签: ruby-on-rails ruby ruby-on-rails-4 rspec


【解决方案1】:

问题是您缺少设计初始化程序期望找到的变量,但仅在test 环境中缺少它。 (不是development 环境)

您提供的堆栈跟踪和来自config/initializers/devise.rb 的第 258 行就是所有需要的。首先,让我们看一下堆栈跟踪:

NoMethodError:
undefined method `[]' for nil:NilClass
# ./config/initializers/devise.rb:258:in `block in <top (required)>'
# ./config/initializers/devise.rb:5:in `<top (required)>'
# ./config/environment.rb:5:in `<top (required)>'
# ./spec/rails_helper.rb:4:in `require'
# ./spec/rails_helper.rb:4:in `<top (required)>'
# ./spec/views/dashboard_view_spec.rb:1:in `require'
# ./spec/views/dashboard_view_spec.rb:1:in `<top (required)>'

从下往上,我们可以看到规范的第一行是导致问题的原因。如果您关注堆栈,您会看到它以config/initializers/devise.rb:258 结尾,并抱怨进行[] 方法调用的东西没有得到预期的对象类型作为回报,而是得到nil 作为回报。

查看第 258 行,您会发现:

config.omniauth :facebook, Rails.application.secrets.facebook[:key],  Rails.application.secrets.facebook[:secret], scope: 'email', info_fields: 'email, name'

所以你可以看到[]被调用了两次:

Rails.application.secrets.facebook[:key]
Rails.application.secrets.facebook[:secret]

预期调用Rails.application.secrets.facebook 将返回Enumerable 对象(如数组或哈希),但它返回nil,当它尝试运行nil[:key]nil[:secret] 时引发异常,因为 NilClass 不是 Enumerable 并且没有 [] 方法。您可以在rails console 中自行测试:

nil[:secret]
=> NoMethodError: undefined method `[]' for nil:NilClass

解决方案是确保调用Rails.application.secrets.facebook 返回预期的对象类型。简短的回答是编辑 config/secrets.yml 以确保您需要的 test 环境值存在。

我已经很长时间没有使用设计了,但我假设您可以安全地将用于development 环境的相同值用于test 环境。你可以在别处阅读更多关于secrets()的信息,但config/secrets.yml的基本模板如下:

environment:
  key: value

例如:

test:
  my_secret_key: my_secret_value

将缺少的facebook 机密复制并粘贴到test 环境中应该相当简单。进行更改后,您可以验证它是否有效:

$ RAILS_ENV=test rails console
Rails.application.secrets.facebook[:key]
=> <your key here>

如果可行,则使用 rspec 运行您的规范,它应该成功通过第 1 行。(假设没有其他错误或丢失的秘密)

【讨论】:

  • 我很感激第一行告诉我们所有我们需要知道的,尤其是丢失的文件不是初始化程序(在我的情况下它是一个规范帮助程序)
【解决方案2】:

刚刚遇到同样的错误,但是当我运行 bundle exec rake spec 而不是 bundle exec rspec 时,它起作用了。

【讨论】:

    【解决方案3】:

    我有非常相似的错误。以下是我的解决方法

    运行rspec --backtrace

    这可能会产生大量控制台输出。向右滚动到顶部,然后从顶部开始阅读。它会告诉你问题开始的文件,以及它发生的行。转到该文件(和那行),找出缺少的内容。

    就我而言,它实际上是credentials.yml 中的一个缺失变量,但情况会有所不同。就像@anothermh 的出色回答一样,它基本上是在告诉您缺少什么,因此您必须弄清楚缺少什么并确保提供它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-08
      • 2011-05-18
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2016-06-15
      相关资源
      最近更新 更多