9

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

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

这很好,但我想编写一个测试以确保它保持这种状态。

我已经有一个功能测试来调用 Photo 控制器的显示动作(实际上是由脚手架生成的):

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 后缀。

如何测试自定义 URL?

更新

在查看@fernyb 的答案时,我在同一个 rdoc中找到了这个片段

在测试中,您可以简单地传递 URL 或命名路由来获取或发布。def send_to_jail get '/jail' assert_response :success assert_template "jail/front" end

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

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"}

我想知道我是否做错了什么。

4

2 回答 2

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
于 2009-11-01T03:42:10.037 回答
1

从 Rails API 文档:

路由匹配

指定*[string]为规则的一部分,例如:

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

将覆盖之前未被识别的所有剩余部分。全局值 params[:path]作为路径段数组存在。

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

于 2009-11-01T03:39:41.950 回答