1

如何对通过自定义路由调用的控制器方法进行单元测试?

相关路线是:

/auth/:provider/callback(.:format) {:controller=>"sessions", :action=>"create"}

SessionsController我不能只使用的规范上,get :create因为该路线不存在。如果我也使用get /auth/facebook/callback/它会告诉我No route matches {:controller=>"sessions", :action=>"/auth/facebook/callback"}

即使我在规范文件中设置了 request.env['something'] ,我似乎也不能只使用它,controller.create因为它#create从哈希中访问一些键并且它也重定向到另一个路径。request

4

1 回答 1

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 会阻塞。

如果这不起作用,我建议您检查两件事

  1. “get”是正确的http动词
  2. 您的路线中没有其他必需的参数(我可以看到:provider 是一个)

如果我对路由做任何古怪的事情,我通常会添加一个单独的测试。

test "create - routing" do
  assert_recognizes({
    :controller => "sessions",
    :action => "create",
    :provider => "yourProvider"
    }, "/auth/yourProvider/callback")
end

只要这与您的动作测试相匹配,一切都应该很好。

于 2011-06-13T19:57:21.607 回答