我现在正在升级我的Rails 5应用,目前正在克服以下弃用:
DEPRECATION WARNING: `redirect_to :back` is deprecated and will be removed from Rails 5.1. Please use `redirect_back(fallback_location: fallback_location)` where `fallback_location` represents the location to use if the request has no HTTP referer information. (called from block (3 levels) in <top (required)> at /path/to/some/controller_spec.rb:74)
不用担心。刚刚将控制器切换到新格式:
redirect_back(fallback_location: home_path, message: "Some error")
然而,警告并没有消失,因为测试仍然会查看:back
,如下所示:
expect(response).to redirect_to(:back)
我没有看到任何克服这种弃用的首选方法。有没有其他方法来测试这个,而无需在我的测试中手动指定HTTP_REFERER
?
答案 0 :(得分:5)
好吧,我稍微调查了rails
/ rspec-rails
来源,看起来非常暗淡。这是新的重定向代码:
def redirect_back(fallback_location:, **args)
if referer = request.headers["Referer"]
redirect_to referer, **args
else
redirect_to fallback_location, **args
end
end
rspec-rails专门测试重定向位置,如下所示:
@scope.assert_redirected_to(@expected)
这意味着如果我们不知道重定向位置(或至少是后备位置),我们就差点运气了。 rspec匹配器本身只是测试响应对象是否响应redirect?
为true,但由于Rails重定向当前不会跟踪它们是来自redirect_to
还是redirect_back
,因此没有区别的情况
目前看来,考虑到以下重定向:
redirect_back(fallback_location: "/foo/bar")
我们可以管理的最佳控制器测试是测试:
expect(response).to redirect_to("/foo/bar")
如果我们设法在某个时刻提供Referer
标头,那么哪个会失败。
更多更新!我询问了rspec-rails
,他们对支持这方面的更新不感兴趣。这是一个合理的立场,因为我真的只是在寻找干净的语法来做断言。相反,我已经改为:
let(:back) { 'http://google.com' }
before { request.env['HTTP_REFERER'] = back }
现在我可以保留以下格式:
expect(response).to redirect_to(back)
答案 1 :(得分:0)
目前,测试套件无需解决此问题。
但是,从redirect_to(:back)
到redirect_back
的更改包含未设置HTTP_REFERER的情况的历史记录。
如果我们使用redirect_back
,那么我们应该为此测试边缘情况。
在这两种情况下,我们都不能跳过设置HTTP_REFERER,但这是出于真正的原因。