解决RSPEC中POST请求测试的URI::InvalidURIError错误
问题分析与修复方案
你遇到的URI错误是因为RSpec请求测试中post方法的用法不正确,和Postman的请求逻辑不一样——Rails的测试助手方法已经帮你处理了HTTP方法的声明,不需要在路径里额外加POST前缀。
错误根源
你原来的测试代码里犯了两个关键错误:
- 路径格式错误:
post方法的第一个参数只需要路由路径(比如'/url_contents'),不需要加上POST标识。RSpec的post方法本身就代表发起POST请求,加了POST之后会被当成路径的一部分,导致和测试环境的base URL拼接成无效的URI(比如错误信息里的http://www.example.com:80POST /url_contents...)。 - 参数传递错误:
params需要是哈希结构,而不是直接传字符串。你的控制器通过url_params获取参数,对应应该传递{ url: 'www.google.com' }这样的键值对。
修正后的测试代码
把测试代码改成下面这样就能解决问题:
describe 'POST /url_contents' do context 'when the url is valid' do before { post '/url_contents', params: { url: 'www.google.com' } } it 'returns a status code of 201' do expect(response).to have_http_status(201) end end end
额外的控制器细节优化
顺便提两个控制器里的小问题,避免后续踩坑:
save?应该改成save:save?仅返回布尔值但不会触发回调,save才是真正执行数据库保存操作并返回结果的方法。- 拼写错误:
messsage多了一个s,应该修正为message。
这样修改后,你的RSpec测试就能正常发起请求,不会再出现URI无效的错误了。
内容的提问来源于stack exchange,提问作者Dog
相关产品推荐
相关产品推荐

