【问题标题】:Testing rails routes: can't find ActionController::Assertions::RoutingAssertions methods测试 Rails 路由:找不到 ActionController::Assertions::RoutingAssertions 方法
【发布时间】:2009-11-27 01:09:50
【问题描述】:

我正在尝试在我的 rails 2.3.4 应用程序上测试路线。有几个网站解释了如何测试路线,包括 rails 文档,但按照说明操作时出现错误。

首先,我假设这些测试可以在相关的单元测试文件中完成。似乎没有更明显的地方,也没有文档指定。

也就是说,这是test/unit/TitlesTest.rb的精简版

require File.dirname(__FILE__) + '/../test_helper'

class TitleTest < Test::Unit::TestCase
  # include ActionController::Assertions::RoutingAssertions

  def test_routes
    assert_routing "games", { :controller => "titles", :section => "games", :action => "index", :id => nil }
  end
end

rake test:units 失败并出现错误:

NoMethodError: undefined method `assert_routing' for #<TitleTest:0x7f387232ec98>
    /test/unit/title_test.rb:7:in `test_routes'

我在 Rails API 中看到 assert_routing 是在 ActionController::Assertions::RoutingAssertions 中定义的,所以我尝试包含该模块,结果却让它在其他地方失败。

注意上面代码示例中注释的include 行。

NoMethodError: undefined method `clean_backtrace' for #<TitleTest:0x7fd895fadf00>
    /test/unit/title_test.rb:7:in `test_routes'

clean_backtrace 是 ActionController::TestCase::Assertions 中定义的另一种测试方法。

我没有得到任何关于这些错误的谷歌搜索结果 - 似乎没有其他人遇到这个问题。如果我在新生成的 rails 应用程序中重新创建场景,也会出现问题。我认为我不应该在我的测试用例中包含这些模块。这里可能有什么问题?

【问题讨论】:

  • 你试过包含 ActionController::TestCase::Assertions 吗?
  • 在包含 ActionController::TestCase::Assertions 之后,它似乎工作了。我不认为我应该添加这些包含是正常的。
  • 我也尝试从 ActiveSupport::TestCase 继承而不是 Test::Unit::TestCase,但我仍然需要包含手册。

标签: ruby-on-rails unit-testing routes integration-testing


【解决方案1】:

Giant Robots 上有一个upgrading Rails gotchas 列表。显然你的路由测试应该使用ActionController::TestCase类,而不是ActiveSupport::TestCase

【讨论】:

  • 这似乎也适用于 Rails 3,遗憾的是,指南中也省略了此信息
【解决方案2】:

路由测试应作为集成测试的一部分进行。

这些可以使用script/generate script/generate integration_test routes生成

一个例子:

class RoutesTest < ActionController::IntegrationTest
  fixtures :all

  def test_resources_route
    assert_routing "titles/15", { :controller => "titles", :action => "show", :id => "15" }
  end
end

【讨论】:

  • 对于任何想测试 Rails 路线的人来说,这实际上是一个非常棒的答案
【解决方案3】:

自 Rails 2.3.2 起,您的路由单元测试文件必须包含 ActionController::Assertions::RoutingAssertions 模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多