我想为非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

正确的方法是什么?

最佳答案

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

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

10-08 03:09