为什么我的集成测试失败了? “ArgumentError:错误的参数(预期的URI对象或URI字符串)”

时间:2013-12-25 20:32:41

标签: ruby-on-rails ruby-on-rails-4 integration-testing

为什么此测试会出现此错误?

错误

  1) Error:
PostIntegrationTest#test_should_not_show_comment_box_if_not_logged_in:
ArgumentError: bad argument (expected URI object or URI string)
    test/integration/post_integration_test.rb:6:in `block in <class:PostIntegrationTest>'

代码,post_integration_test.rb

require 'test_helper'

class PostIntegrationTest < ActionDispatch::IntegrationTest

  test "should not show comment box if not logged in" do
    get :show, 'id' => 1                       ########### LINE 6
    assert_select 'textarea', false, "Comment textarea must not exist if not logged in"
  end

也不起作用

get :show, {'id' => 1}
get :show, {id: 1}

参考

这表示你可以传递参数。 http://api.rubyonrails.org/classes/ActionController/TestCase/Behavior.html#method-i-get

这是使用get参数的示例:http://guides.rubyonrails.org/testing.html#setup-and-teardown

版本

$ rails -v
Rails 4.0.0

2 个答案:

答案 0 :(得分:5)

:show在集成测试中不可用,这些操作仅在Controller测试中可用。您需要使用您的网址的_path帮助器或字符串表示。

test "should not show comment box if not logged in" do
  # Assuming path is /posts.  Replace accordingly.
  get "/posts/1"                      ########### LINE 6
  assert_select 'textarea', false, "Comment textarea must not exist if not logged in"
end

答案 1 :(得分:4)

Rails Testing Guide中给出的示例中我们看到,在集成测试中,get / post / put / delete有一个url作为第一个参数。虽然控制器测试具有操作名称。

因为在控制器测试中 minitest 知道调用了哪个控制器的操作(show,destroy,new,create),因为我们在中指定了控制器名称我们的测试类名称。因此,在集成测试中,我们必须传递网址。