如何对通过自定义路径调用的控制器方法进行单元测试?
相关路线是:
/auth/:provider/callback(.:format) {:controller=>"sessions", :action=>"create"}
在SessionsController
的规范上,我不能只使用get :create
,因为该路由不存在。如果我也使用get /auth/facebook/callback/
,它会告诉我No route matches {:controller=>"sessions", :action=>"/auth/facebook/callback"}
。
似乎我不能只使用controller.create
,因为#create
访问request
哈希中的某些键,并且它也会重定向到另一个路径,即使我设置了request.env
答案 0 :(得分:1)
功能测试应该测试每个动作的功能 (给定一组参数)
至关重要的是,您应该将功能测试与路线分离。 (无论如何,路由抽象中的重点是什么)
在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无法匹配此请求的路由,则会阻塞。
如果这不起作用,我建议您检查两件事
如果我在路由方面做任何古怪的事情, 我通常会添加一个单独的测试。
test "create - routing" do
assert_recognizes({
:controller => "sessions",
:action => "create",
:provider => "yourProvider"
}, "/auth/yourProvider/callback")
end
只要这与您的动作测试匹配 一切都应该好。