问题描述
|
如何对通过自定义路由调用的控制器方法进行单元测试?
相关路线是:
/auth/:provider/callback(.:format) {:controller=>\"sessions\",:action=>\"create\"}
在ѭ1的规格中,我不能仅使用get :create
,因为该路由不存在。如果我也使用get /auth/facebook/callback/
,它将告诉我No route matches {:controller=>\"sessions\",:action=>\"/auth/facebook/callback\"}
。
似乎我不能只使用controller.create
,因为I6ѭ会从request
哈希访问某些键,即使我在spec文件中设置了request.env [\'something \'],它也会重定向到另一个路径。
解决方法
功能测试应测试每个动作的功能
(给定一组参数)
至关重要的是,您应该使功能测试与路线脱钩。
(否则,路由抽象的重点是什么)
在test :: unit中,功能测试看起来像这样
test \"#{action_name} - does something\" do
#{http_verb} :#{action_name},:params => {:their => \"values\"}
assert_response :#{expected_response}
end
注意,我们没有提到任何地方的路由。
因此是您创建的真实示例
test \"create - creates a session\" do
get :create,:provider => \"your provider\"
assert_response :success
end
如果Rails与该请求的路由不匹配,它将阻塞。
如果这样不起作用,建议您检查两件事
\“ get \”是正确的http动词
您的路线中没有其他必需的参数(我可以看到:provider是其中之一)
如果我对路由做任何古怪的事情,
我通常会添加一个单独的测试。
test \"create - routing\" do
assert_recognizes({
:controller => \"sessions\",:action => \"create\",:provider => \"yourProvider\"
},\"/auth/yourProvider/callback\")
end
只要这与您的行动测试相符
一切都应该很好。