任意或自定义URL的Rails功能测试

时间:2009-11-01 03:15:45

标签: ruby-on-rails url controller functional-testing

我的Rails应用程序中有一个名为“Photo”的RESTful资源。我正在使用Paperclip为我的照片提供不同的“样式”(缩略图等),我正在使用自定义路径来RESTful访问这些样式:

map.connect "photos/:id/style/*style", :controller => "photos", :action => "show"

这工作正常,但我想写一个测试,以确保它保持这种方式。

我已经有一个功能测试来调用Photo控制器的show动作(事实上由scaffold生成):

test "should show photo" do
  get :show, :id => photos(:one).to_param
  assert_response :success
end

测试URL“/ photo / 1”处的操作执行情况。现在我想测试URL“/ photo / 1 / style / foo”的执行情况。不幸的是,我似乎无法获得ActionController :: TestCase来访问该URL; get方法总是需要一个action / id,并且不接受URL后缀。

如何测试自定义网址?

更新

在查看@ fernyb的回答时,我在the same rdoc

中找到了这个代码段
  

在测试中,您只需传递URL或命名路由即可获取或发布。       def send_to_jail         得到'/ jail'         assert_response:成功         assert_template“jail / front”       端

然而,当我实际尝试时,我收到一条错误消息:

test "should get photo" do
  get "/photos/1/style/original"
  assert_equal( "image/jpeg", @response.content_type )
end  

ActionController::RoutingError: No route matches {:action=>"/photos/1/style/original", :controller=>"photos"}

我想知道我做错了什么。

2 个答案:

答案 0 :(得分:5)

使用assert_routing测试路线:

assert_routing("/photos/10/style", :controller => "photos", :action => "show", :id => "10", :style => [])

assert_routing("/photos/10/style/cool", :controller => "photos", :action => "show", :id => "10", :style => ["cool"])

assert_routing("/photos/10/style/cool/and/awesome", :controller => "photos", :action => "show", :id => "10", :style => ["cool", "and", "awesome"])

集成测试中,您可以执行以下操作:

test "get photos" do
   get "/photos/10/style/cool"
   assert_response :success
end

答案 1 :(得分:1)

From the Rails API documentation:

  

路线整理

     

指定*[string]作为其中一部分   规则如:

map.connect '*path' , :controller => 'blog' , :action => 'unrecognized?'
     

会将所有其余部分全部删除   未被识别的路线   早。全局值是在   params[:path]作为路径数组   段。

所以看起来你需要传递:path个参数,才能正确测试动作。