在Rails 5中使用Rspec测试redirect_back

时间:2016-07-02 17:53:20

标签: ruby-on-rails rspec ruby-on-rails-5

我现在正在升级我的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

2 个答案:

答案 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,那么我们应该为此测试边缘情况。

  1. 设置HTTP_REFERER时
  2. 未设置HTTP_REFERER时
  3. 在这两种情况下,我们都不能跳过设置HTTP_REFERER,但这是出于真正的原因。