Ruby on rails 如何在Rails中测试任意路由?

Ruby on rails 如何在Rails中测试任意路由?,ruby-on-rails,ruby,unit-testing,testing,routes,Ruby On Rails,Ruby,Unit Testing,Testing,Routes,我想为非RESTful路由编写Rails功能测试 我正在使用Test::Unit 在routes.rb中,我有一条路线 match '/contract_search' => 'contracts#contract_search', \ :as => 'contract_search', \ :via => :post 在我的合同中,我有这个动作 def contract_search # ... end 在contracts\u controller\

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

我正在使用Test::Unit

routes.rb
中,我有一条路线

match '/contract_search' => 'contracts#contract_search', \
    :as => 'contract_search', \
    :via => :post
在我的合同中,我有这个动作

def contract_search
  # ...
end
contracts\u controller\u 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>'
1)错误:
使用搜索参数对合同进行测试(合同控制测试):
NoMethodError:nil:NilClass的未定义方法“length”
测试/功能/合同\u控制器\u测试。rb:49:in‘block in’
我的感觉是Test::Unit试图发布到
/contracts/contract\u search


正确的方法是什么?

问题不在于路由,而在于断言中的
分配(:契约)
<代码>赋值(:契约)
为零,因此当您在其上调用
length
时,它返回一个
NoMethodError


答案必须在您的
合同搜索
操作中,您可以发布代码吗?

因为在测试代码中您正在使用
分配(:合同)
,您必须确保控制器方法正确填充
@contracts
变量

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