2016-07-02 172 views
4

我升级我的Rails应用程序5现在,目前克服以下弃用:测试redirect_back使用RSpec 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

现在没有什么可以解决这个问题的测试套件了。 但是从redirect_to(:back)redirect_back的变化对于HTTP_REFERER未设置的情况具有历史记录。 如果我们使用redirect_back那么我们应该测试边缘情况。

  1. 当HTTP_REFERER设置
  2. 当HTTP_REFERER没有设置

在这两种情况下,我们不能跳过设置HTTP_REFERER,但多数民众赞成真正原因。

+0

同意了,我的测试中实际处理这件事到现在为止:d –

3

好吧,我看了一下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护栏专门测试重定向位置,就像这样:

@scope.assert_redirected_to(@expected) 

这将意味着,如果我们不知道重定向位置(或者至少回退的位置),我们几乎不走运。 rspec匹配器本身只是测试响应对象是否响应redirect?,但是由于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)