Rspec Rails如何测试控制器动作单次重定向至带修改参数的自身?
解决RSpec控制器重定向测试的两个问题
我来帮你搞定这两个测试里的问题,这都是RSpec控制器测试中关于重定向验证的常见场景:
1. 验证带有弃用参数时的永久重定向
你的第一个测试问题在于硬编码了域名,而且没有充分利用RSpec的匹配器和路由辅助方法。在RSpec控制器测试中,默认不会自动跟随重定向,所以你拿到的response就是那个301的重定向响应,直接验证它的目标和状态码即可。
修改后的测试代码:
context '使用已弃用参数时' do it '应执行永久重定向到带新参数的搜索路径' do # Rails 5+ 需要将参数放在 params: 关键字参数中 get :search, params: { deprecated_param: 'yes' } # 验证重定向状态码是301(永久移动) expect(response).to have_http_status(:moved_permanently) # 用路由辅助方法匹配重定向目标,避免硬编码URL expect(response).to redirect_to(search_path(new_param: 'yes')) end # 如果你需要验证重定向后的最终响应状态,可以加这个测试 it '重定向后最终返回200状态' do get :search, params: { deprecated_param: 'yes' } # 跟随重定向 follow_redirect! expect(response).to have_http_status(200) end end
2. 验证未使用弃用参数时无重定向
要确认没有触发重定向,RSpec提供了be_redirect匹配器,直接断言响应不是重定向状态,再结合200状态码验证即可:
修改后的测试代码:
context '未使用已弃用参数时' do it '不应执行任何重定向' do get :search, params: { new_param: 'yes' } # 断言响应不是重定向状态 expect(response).not_to be_redirect # 确认直接返回200成功状态 expect(response).to have_http_status(200) end end
额外注意事项
- 如果你使用的是Rails 5及以上版本,控制器测试的HTTP请求方法(
get/post等)需要将参数放在params:关键字参数里,旧的直接传参写法会报错。 - 使用路由辅助方法(比如
search_path)比硬编码完整URL更可靠,它会自动适配测试环境的配置,不用手动写域名。
内容的提问来源于stack exchange,提问作者Niels Kristian
相关产品推荐
相关产品推荐

