Rails自动化测试删除方法报错:No route matches [DELETE] '/adjusters/1/edit'
问题原因与解决方案
你的测试失败的核心原因是使用了错误的路径助手来发送DELETE请求,具体拆解如下:
edit_adjuster_path(@adjuster)对应的是GET请求的编辑页面路由(/adjusters/1/edit),这个路由只支持GET方法,完全不接受DELETE请求,所以才会抛出No route matches [DELETE] '/adjusters/1/edit'的错误。- 而删除动作(destroy)对应的RESTful路由是
DELETE /adjusters/:id,对应的路径助手是adjuster_path(@adjuster),正好匹配你通过rake routes查到的规则:DELETE /adjusters/:id(.:format) adjusters#destroy。
另外还有个小细节需要修正:assert_nil(@adjuster) 无法验证对象是否真的从数据库中被删除——因为@adjuster是内存中的对象,哪怕数据库里的记录被删除,这个内存对象依然存在。你需要直接检查数据库中是否还存在该记录。
修正后的测试代码
# 创建测试用的实例变量 def setup @adjuster = Adjuster.create(adjuster_name: "TestLastName", address_1: "4511 W 200 S", id: 1) end # 测试删除已创建的调整器 test "delete adjuster" do # 使用正确的路径助手发送DELETE请求 delete adjuster_path(@adjuster) follow_redirect! # 验证数据库中已不存在该记录 assert_not Adjuster.exists?(@adjuster.id) end
补充说明
你之前用get edit_adjuster_path(@adjuster)能成功完成更新,是因为编辑页面的路由本身就对应GET方法,请求方法和路由规则匹配,所以没有问题。而RESTful设计中,删除动作是对单个资源(/adjusters/:id)发送DELETE请求,和编辑页面的路由是完全独立的两个规则,不能混用。
内容的提问来源于stack exchange,提问作者chase dougherty
相关产品推荐
相关产品推荐

