我的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"}
我想知道我做错了什么。
答案 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
个参数,才能正确测试动作。