单元测试通过自定义路由调用的控制器方法

时间:2011-06-13 09:27:45

标签: ruby-on-rails ruby-on-rails-3 rspec rspec2 rspec-rails

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

相关路线是:

/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

1 个答案:

答案 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无法匹配此请求的路由,则会阻塞。

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

  1. “get”是正确的http动词
  2. 您的路线中没有其他必需参数(我可以看到:提供商是一个)
  3. 如果我在路由方面做任何古怪的事情, 我通常会添加一个单独的测试。

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

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