【问题标题】:How can I test arbitrary routes in Rails?如何在 Rails 中测试任意路由?
【发布时间】:2012-08-23 02:47:08
【问题描述】:

我想为非 RESTful 路由编写 Rails 功能测试。

我正在使用 Test::Unit。

routes.rb我有这条路线...

match '/contract_search' => 'contracts#contract_search', \
    :as => 'contract_search', \
    :via => :post

在我的合同控制器中,我有这个动作......

def contract_search
  # ...
end

contracts_controller_test.rb 我试过...

test 'POST to contracts with search params.' do
  post(:contract_search, {
    :contract_search => {
      :title_like => 'System'
    }
  }, unprivileged_internal_user_session_vars, { })

  assert(
    assigns(:contracts).length == 6,
    "@contracts.length #{assigns(:contracts).length} is incorrect."
  )

end

该操作在浏览器中按预期工作。

但是测试出错了...

  1) Error:
test_POST_to_contracts_with_search_params.(ContractsControllerTest):
NoMethodError: undefined method `length' for nil:NilClass
    test/functional/contracts_controller_test.rb:49:in `block in <class:ContractsControllerTest>'

我的感觉是 Test::Unit 正试图发布到 /contracts/contract_search,我想。

这样做的正确方法是什么?

【问题讨论】:

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


    【解决方案1】:

    由于在您的测试代码中您使用的是assigns(:contracts),因此您必须确保您的控制器方法正确地填充了@contracts 变量。

    可能是您错过了运行测试用例的一些先决条件。

    【讨论】:

      【解决方案2】:

      问题不在于路由,而在于您的断言中的assigns(:contracts)assigns(:contracts) 为 nil,因此当您在其上调用 length 时,它会返回 NoMethodError

      答案必须在您的contract_search 操作中,您可以发布代码吗?

      【讨论】:

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