Ruby on Rails测试失败,按《Agile Web Development with Rails 4》修改后仍报错如何解决
问题原因
- 你遇到的报错核心是Rails版本不兼容:《Agile Web Development with Rails 4》对应的是Rails 4.x的测试语法,你本地使用的Rails版本高于4.2(Rails 5及以上),语法规则发生了两次关键变更:
- Rails 5开始,HTTP请求测试方法不允许将请求参数作为顶级关键字传入,必须统一包裹在
params参数内,这就是你第一次按照书里修改后出现unknown keywords: :id, :product错误的原因。 - Rails 5+默认使用集成风格的控制器测试,不再支持将控制器动作符号(
:create/:update)作为请求方法的第一个参数,必须传入完整路由路径或路由辅助方法,这就是你第二次修改后出现URI::InvalidURIError的原因——Rails把你传入的动作符号直接拼接到了域名后生成了非法路径。
- Rails 5开始,HTTP请求测试方法不允许将请求参数作为顶级关键字传入,必须统一包裹在
修复方案
- 保留setup代码块中添加的
@update变量定义,这部分逻辑通用无需修改。 should_create_product测试用例修改为如下代码:
post products_url, params: { product: @update }
should_update_product测试用例修改为如下代码:
patch product_url(@product), params: { product: @update }
以上写法同时兼容Rails 4.2+所有版本,参数已经正确包裹在params中,同时使用路由辅助方法生成合法请求路径,不会再出现上述两类报错。
内容的提问来源于stack exchange,提问作者gurman
相关产品推荐
相关产品推荐

