ruby rails 测试用例失败但真正的应用程序工作
ruby rails test case failing but real app works
所以这是一个奇怪的问题:当我启动本地 rails 应用程序并浏览到 http://localhost:3000/static_pages/help 时,我可以看到我在那里创建的页面。
然而,我写的测试用例却另有说法。
static_pages_controller_test.rb
require 'test_helper'
class StaticPagesControllerTest < ActionController::TestCase
test "should get home" do
get :home
assert_response :success
end
test "should get help" do
puts static_pages_help_url
puts static_pages_help_path
get static_pages_help_url
assert_response :success
end
end
失败并出现此错误,$bin/rake 测试的输出:
Running:
..http://test.host/static_pages/help
/static_pages/help
E
Finished in 0.466745s, 8.5700 runs/s, 4.2850 assertions/s.
1) Error.
StaticPagesControllerTest#test_should_get_help:
ActionController::UrlGenerationError: No route matches {:action=>"http://test.host/static_pages/help", :controller=>"static_pages"}
test/controllers/static_pages_controller_test.rb:12:in `block in <class:StaticPagesControllerTest>'
这里是routes.rb
Rails.application.routes.draw do
get 'static_pages/home'
get "static_pages/help"
end
这里是 static_pages_controller.rb
class StaticPagesController < ApplicationController
def home
end
def help
end
end
和这两个文件
app/views/static_pages/home.html.erb
app/views/static_pages/help.html.erb
存在,因为我在浏览器中导航到 /static_pages/help 时也可以看到它们。我在网上搜索了几个小时,没有任何线索。
$ rails --version
Rails 4.2.7.1
$ ruby --version
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
我一定是漏掉了什么。请帮忙。
由于您正在编写控制器规范,因此 GET
的参数应该是 action
(控制器方法)。但是你传递的是 URL。如果您查看错误消息,您会发现 "http://test.host/static_pages/help"
已传递到 action
。因此,将控制器方法的名称作为 symbol
而不是 URL 传递。尝试
get :help
注意help
是控制器动作。
但是,如果您有兴趣编写 integration
测试,您应该继承 ActionDispatch::IntegrationTest
而不是 ActionController::TestCase
。所以,您的规范应该看起来像这样。
class StaticPagesControllerTest < ActionDispatch::IntegrationTest
test "should get home" do
get static_pages_home_url
assert_response :success
end
test "should get help" do
get static_pages_help_url
assert_response :success
end
end
要了解有关集成和控制器测试的更多信息,请参阅 http://weblog.jamisbuck.org/2007/1/30/unit-vs-functional-vs-integration.html
希望对您有所帮助!
所以这是一个奇怪的问题:当我启动本地 rails 应用程序并浏览到 http://localhost:3000/static_pages/help 时,我可以看到我在那里创建的页面。 然而,我写的测试用例却另有说法。
static_pages_controller_test.rb
require 'test_helper'
class StaticPagesControllerTest < ActionController::TestCase
test "should get home" do
get :home
assert_response :success
end
test "should get help" do
puts static_pages_help_url
puts static_pages_help_path
get static_pages_help_url
assert_response :success
end
end
失败并出现此错误,$bin/rake 测试的输出:
Running:
..http://test.host/static_pages/help
/static_pages/help
E
Finished in 0.466745s, 8.5700 runs/s, 4.2850 assertions/s.
1) Error.
StaticPagesControllerTest#test_should_get_help:
ActionController::UrlGenerationError: No route matches {:action=>"http://test.host/static_pages/help", :controller=>"static_pages"}
test/controllers/static_pages_controller_test.rb:12:in `block in <class:StaticPagesControllerTest>'
这里是routes.rb
Rails.application.routes.draw do
get 'static_pages/home'
get "static_pages/help"
end
这里是 static_pages_controller.rb
class StaticPagesController < ApplicationController
def home
end
def help
end
end
和这两个文件
app/views/static_pages/home.html.erb
app/views/static_pages/help.html.erb
存在,因为我在浏览器中导航到 /static_pages/help 时也可以看到它们。我在网上搜索了几个小时,没有任何线索。
$ rails --version
Rails 4.2.7.1
$ ruby --version
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
我一定是漏掉了什么。请帮忙。
由于您正在编写控制器规范,因此 GET
的参数应该是 action
(控制器方法)。但是你传递的是 URL。如果您查看错误消息,您会发现 "http://test.host/static_pages/help"
已传递到 action
。因此,将控制器方法的名称作为 symbol
而不是 URL 传递。尝试
get :help
注意help
是控制器动作。
但是,如果您有兴趣编写 integration
测试,您应该继承 ActionDispatch::IntegrationTest
而不是 ActionController::TestCase
。所以,您的规范应该看起来像这样。
class StaticPagesControllerTest < ActionDispatch::IntegrationTest
test "should get home" do
get static_pages_home_url
assert_response :success
end
test "should get help" do
get static_pages_help_url
assert_response :success
end
end
要了解有关集成和控制器测试的更多信息,请参阅 http://weblog.jamisbuck.org/2007/1/30/unit-vs-functional-vs-integration.html
希望对您有所帮助!