Rails测试中edit_path使用问题:edit路由测试报错但实际可用
解决Rails控制器测试中Edit路由无法识别id的问题
嘿,这个问题我碰到过!咱们一步一步来理清楚:
问题根源
你在setup方法里用了Adjuster.new创建对象:
def setup @adjuster = Adjuster.new(adjuster_name: "TestLastName", address_1: "4511 W 200 S", id: 1) end
new方法只会在内存中创建对象,不会把它保存到测试数据库里。而你的edit控制器动作(逻辑应该类似def edit; @adjuster = Adjuster.find(params[:id]); end)会尝试从数据库里查找对应id的记录,自然找不到仅存在于内存中的@adjuster,所以抛出了Couldn't find Adjuster with 'id'=1的错误。
至于你的show测试能“正常通过”,其实是个小乌龙:你调用的adjusters_path(@adjuster)是索引路由(对应/adjusters),这个路由不需要id参数,所以不管对象有没有保存,请求都能成功返回。如果你真正想测试单个adjuster的show页面,应该用adjuster_path(@adjuster),这时候如果对象没保存,同样会报错。
解决方案
把setup里的Adjuster.new改成Adjuster.create,这样对象会被保存到测试数据库中:
def setup @adjuster = Adjuster.create(adjuster_name: "TestLastName", address_1: "4511 W 200 S") end
这里不需要手动指定id,Rails会自动为你生成唯一的主键id,手动指定id反而可能引发测试环境中的冲突(比如之前的测试数据没清理干净,id=1已经被占用)。
修改后,edit_adjuster_path(@adjuster)会正确生成类似/adjusters/1/edit的路径,控制器也能从数据库中找到对应的记录,测试就能顺利通过啦!
内容的提问来源于stack exchange,提问作者chase dougherty
相关产品推荐
相关产品推荐

