我想为非 RESTful 路由编写 Rails 功能测试。
我正在使用 Test::Unit。
在 routes.rb
我有这条路线...
match '/contract_search' => 'contracts#contract_search', \
:as => 'contract_search', \
:via => :post
在我的 Contracts Controller 中我有这个 Action ......
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)
,您必须确保您的 Controller 方法正确地填充了 @contracts
变量。
可能是您错过了运行测试用例的一些先决条件。
关于ruby-on-rails - 如何在 Rails 中测试任意路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12084073/