URI::InvalidURIError: bad URI(is not URI?) testing Rails 控制器

Posted

技术标签:

【中文标题】URI::InvalidURIError: bad URI(is not URI?) testing Rails 控制器【英文标题】:URI::InvalidURIError: bad URI(is not URI?) testing Rails controllers 【发布时间】:2016-03-10 19:28:19 【问题描述】:

我得到 URI::InvalidURIError 测试 Rails Home 控制器:

require 'test_helper'

class HomeControllerTest < ActionDispatch::IntegrationTest
  test "should get index" do
    get :index
    assert_response :success
  end
end

得到以下错误:

E

Error:
HomeControllerTest#test_should_get_index:
URI::InvalidURIError: bad URI(is not URI?): http://www.example.com:80index
    test/controllers/home_controller_test.rb:7:in `block in <class:HomeControllerTest>'

堆栈如下:

Rails 5.0.0.beta3
minitest (5.8.4)

【问题讨论】:

【参考方案1】:

控制器测试继承自 ActionController::TestCase,而您的测试 继承自ActionDispatch::IntegrationTest。因此,您使用的是集成测试而不是控制器测试。

错误是:

http://www.example.com:80index

这看起来不对,是吗? ;-)

解决办法是使用完整的路径:

get '/index'

请记住,集成测试并没有真正与任何特定的控制器(或其他任何东西)相关联。他们测试您的应用程序中几个组件的集成。因此,如果您正在测试 UserControllerindex 操作,您可能需要使用 /users/index

如果您打算进行控制器测试而不是集成测试,则需要设置正确的超类。使用get :index(用于索引方法)应该可以正常工作。

【讨论】:

嘿,我在控制器测试中根本没有看到“ActionDispatch::IntegrationTest”...我正在深入研究 ...奇怪,似乎在 Rails 5.0.0.beta3 中,脚手架生成器默认/设计生成这样的测试控制器... @LucaG.Soave Taht 似乎很奇怪......我自己并没有真正使用生成器工具,但也许你调用错了?在任何情况下,集成测试与控制器测试没有太大区别,AFAIK 你在控制器测试中可以做的所有事情,你都可以在集成测试中做(但不能反过来)。我更喜欢自己使用集成测试。 @Carpetsmoker 集成测试已取代 Rails 5 中的 TestCase。 put :update, id: @product, product: @update 这个东西怎么写成 url 形式,我遇到同样的错误【参考方案2】:

你可以试试:

get home_index_path

代替:

get :index

【讨论】:

以上是关于URI::InvalidURIError: bad URI(is not URI?) testing Rails 控制器的主要内容,如果未能解决你的问题,请参考以下文章

Pod 安装私有 Pod URI::InvalidURIError - 错误的 URI(不是 URI?)

为什么我的ec2机器上的puma.stderr.log中出现此错误“错误的URI(不是URI?)”

Logstash2.3.4趟坑之集成Redis哨兵模式

解决nfs挂载错误wrong fs type, bad option, bad superblock

多个文件的内存分配错误“在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用” [C ++]

mount: wrong fs type, bad option, bad superblock