- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用内置的 Minitest 为 Rails v5.1 编写集成测试。
这是集成测试类:
require 'test_helper'
class PuppiesEndpointsTest < ActionDispatch::IntegrationTest
include Devise::Test::IntegrationHelpers
test "DELETE puppy" do
marty = people(:marty)
sign_in(marty)
# delete puppies_delete_path(marty.puppies.first.id)
# delete `/api/v1/puppies/destroy/${marty.puppies.first.id}.json`
# delete puppies_path(marty.puppies.first.id)
delete '/api/v1/puppies/destroy/6666.json'
assert_response :success
end
end
上面的所有路由,包括被注释掉的路由,都会导致相同的神秘错误:
Error:
PuppiesEndpointsTest#test_DELETE_puppy:
NoMethodError: undefined method `[]=' for nil:NilClass
test/integration/puppies_endpoints_test.rb:17:in `block in <class:PuppiesEndpointsTest>'
bin/rails test test/integration/puppies_endpoints_test.rb:7
它没有提供堆栈跟踪或任何其他信息来诊断它到底在说什么。我使用 byebug 来调试抛出错误的 delete
行之前的 marty
变量。它显示了预期的关联(固定)记录的小狗数组。
我还在 Controller 操作的最顶部放置了一个 byebug,并且此错误在到达该 byebug 之前使测试失败,因此我认为这几乎排除了操作代码中的任何内容。
这是我运行rake paths
时看到的相关内容:
PATCH /api/v1/puppies/edit/:id(.:format) puppies#update
DELETE /api/v1/puppies/destroy/:id(.:format) puppies#destroy
puppies_create POST /api/v1/puppies/create(.:format) puppies#create
这是我的路线文件中的实际内容:
scope '/api' do
scope '/v1' do
devise_for :people
patch 'puppies/edit/:id' => 'puppies#update'
delete 'puppies/destroy/:id' => 'puppies#destroy'#, as: 'puppies_delete'
post 'puppies/create' => 'puppies#create'
...
我完全不明白我收到此错误的原因/原因。实际代码完全按照预期工作。
我的预感是,可能缺少一个配置变量,该变量没有为测试环境设置(我使用 dotenv gem),但如果错误不会给我任何上下文,我不知道如何跟踪它。
更新
我已使用 Devise 帮助器 sign_in
方法将此问题隔离。当我删除此方法调用时,问题就消失了。
这是有问题的测试类:
require 'test_helper'
class PuppiesEndpointsTest < ActionDispatch::IntegrationTest
include Devise::Test::IntegrationHelpers
test "do stuff" do
...
应用程序/ Controller /api_controller.rb:
class ApiController < ActionController::API
end
也许sign_in
不适用于测试不继承自ActionController::Base的 Controller
我将 Controller 更改为从 ActionController::Base
继承,但没有任何变化。我仍然无法在不出现该错误的情况下使用 sign_in
,但如果我“手动”post
向 Sign_in 端点发送请求,它就可以找到。
更新2我发现这个 Devise 问题听起来与我的问题相关:https://github.com/plataformatec/devise/issues/2065
最佳答案
看起来我找到了issue 。显然,在rails-api模式下,ActionDispatch::Cookies和ActionDispatch::Session::CookieStore中间件被插入到中间件堆栈的末尾,这在普通Rails模式下不会发生。
因此,这些中间件包含在 Warden::Manager 之后,这会弄乱请求规范中的某些内容。
尝试在test.rb中设置
Rails.application.config.middleware.insert_before Warden::Manager, ActionDispatch::Cookies
Rails.application.config.middleware.insert_before Warden::Manager, ActionDispatch::Session::CookieStore
关于ruby-on-rails - Rails 5 集成测试失败,出现 NoMethodError : undefined method `[]=' for nil:NilClass when using Devise helper sign_in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54979970/
上下文: 我从存储库中提取了最新的代码,并尝试确保我将要推送的更改能够与该版本的代码一起使用。这是一个 Ruby on Rails 应用程序。另外值得注意的是,在运行我从网络上提取的主应用程序时,不会
让我们考虑以下代码: class Try CONST = xxx("42") private_class_method def self.xxx(str) str.to_i end end
我一直在寻找解决方案,但最相关的答案似乎规定使用 self. ,我已经在做;我无法用我可以找到我做错了什么的方式来表达我的搜索。我正在定义一个类,如下所示,但是当我尝试创建一个实例时,我得到了 NoM
我向 String 类添加了一个额外的方法。我想稍后使用此方法,但出现 no Method 错误。 class String def as_file_full_path NSSear
我尝试使用 ruby on Rails 请求数据库中的日期时间条目。这在 Linux 环境中工作得很好,但在我的 Windows 环境中我得到了 NoMethodError。调试时,我发现将日期时
我正在努力学习 ruby。我卡在第 26 课了。Here是文件的链接。这是错误所在的代码片段: five = 10 - 2 + 3 - 6 puts "This should be five: #
我不想在某个地方引发 NoMethodError 而只是针对某个类(例如 NilClass)。 例如 begin maybe_nil_maybe_not_nil = nil maybe_nil
我有一个正在编写的 sinatra 应用程序。我正在尝试编写一个页面来显示存储在数据库中的各个模式。使用 datamapper 我创建了一个类: require 'dm-core' require '
不确定是否有很多人熟悉 Ruby 的脚手架扩展,但我查看了他们的文档、论坛,甚至 Heroku 测试站点的源代码,但没有找到答案。 我制作了一个基本的 Sinatra 应用程序并按照 RDoc 的说明
我正在创建一个 Die 类,它具有输出骰子编号的功能。它已被命名为 printout 和 output,但由于 NoMethodError,函数继续失败。这是我的代码: class Die def
Whole source code here 我觉得我的程序流程有逻辑错误,返回NoMethodError 首先,一段导致错误的代码。 " /> #Error Text NoMethodError a
我正在尝试从我的一个规范助手中的模块访问方法 我将模块包含在测试助手中 module Support class RestHelper include Rest::Rest def
我在学习 Ruby 的时候正在做一个简单的 Pi Generator,但是我在 RubyMine 6.3.3 上一直遇到 NoMethodError,所以我决定用尽可能简单的方式创建一个新项目和新类,
我有一个这样的模块: module Prober def probe_invoke(type, data = {}) p = Probe.new({:probe_type => type.
我有一个 ruby 程序,它在特定的命名空间中创建部署、服务和 ing。当我想创建一个命名空间时,它会提示 NoMethodError。 这是代码: namespace = Kubeclient:
context 'with event_type is available create event' do let(:event_type) { EventType.where( name: '
我在 Ruby 中发现了一个奇怪的问题,我不太确定这是一个问题还是最近 Ruby 版本中引入的一个功能。 基本上当我们调用一个未定义的方法时,我们会得到一个 undefined method Ruby
我有以下 Ruby 代码,其中 BigClass 的每个实例创建一个具有 BigClass 实例的数组(直到最大深度)。 class BigClass # Increase this depend
我正在尝试 ror 教程,我遇到了以下代码行: index.html.erb: @players %> _player.html.erb: players_controller.rb: de
当我的 DeltaSynWorker 运行时,我收到 NoMethodErrors。这发生在作为当前工作应用程序的修订版构建的应用程序中。我不是最初的程序员,我是从 Java 背景开始的(我提到这一点
我是一名优秀的程序员,十分优秀!