我想为非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
,我认为。
这样做的正确方法是什么?
答案 0 :(得分:2)
由于您在测试代码中使用assigns(:contracts)
,因此必须确保控制器方法正确填充@contracts
变量。
可能你错过了运行测试用例的一些先决条件。
答案 1 :(得分:0)
问题不在于路由,而是在断言中使用assigns(:contracts)
。 assigns(:contracts)
为零,因此当您致电length
时,它会返回NoMethodError
。
答案必须在contract_search
操作中,您可以发布代码吗?