2011-06-13 102 views
0

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

相关的路线是:

/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因为#createrequest散列访问某些键,它也重定向到其他路径,即使我设置request.env [“东西”]在规范文件。

回答

1

功能测试应该测试每个动作 (给定一组参数)

至关重要的功能,请妥善保管您从您的路线去耦功能测试。 (还有什么是无论如何路由抽象的点)这样

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. “得到”是正确的HTTP动词
  2. 有在你的路线没有其他必需的参数(我可以看到:供应商是一个)

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

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

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

+0

'get:create,:provider =>'提供者名称'诀窍。谢谢! – 2011-06-14 08:10:49

相关问题