在Rails 5中使用Rspec测试redirect_back

Jos*_*tey 5 rspec ruby-on-rails 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)
Run Code Online (Sandbox Code Playgroud)

别担心.刚刚将控制器切换到新格式:

redirect_back(fallback_location: home_path, message: "Some error")
Run Code Online (Sandbox Code Playgroud)

但是,警告不会消失,因为测试仍然会看到:back,如下所示:

expect(response).to redirect_to(:back)
Run Code Online (Sandbox Code Playgroud)

我没有看到任何克服这种弃用的首选方法.有没有其他方法来测试这个,而无需HTTP_REFERER在我的测试中手动指定?

Jos*_*tey 6

好吧,我看了一下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
Run Code Online (Sandbox Code Playgroud)

并且rspec-rails专门测试重定向位置,如下所示:

@scope.assert_redirected_to(@expected)
Run Code Online (Sandbox Code Playgroud)

这意味着如果我们不知道重定向位置(或至少是后备位置),我们几乎不走运.rspec匹配器本身只是测试响应对象是否响应为redirect?true,但由于Rails重定向当前不跟踪它们是否来自redirect_to或者redirect_back,因此没有区别的情况.

目前看来,给定以下重定向:

redirect_back(fallback_location: "/foo/bar")
Run Code Online (Sandbox Code Playgroud)

我们可以管理的最佳控制器测试是测试:

expect(response).to redirect_to("/foo/bar")
Run Code Online (Sandbox Code Playgroud)

如果我们设法Referer在某个时刻提供标题,那将失败.


更多更新!我四处询问rspec-rails,他们对支持这方面的更新不感兴趣.这是一个合理的立场,因为我真的只是在寻找干净的语法来做断言.相反,我已经改为:

let(:back) { 'http://google.com' }
before { request.env['HTTP_REFERER'] = back }
Run Code Online (Sandbox Code Playgroud)

现在我可以保留以下格式:

 expect(response).to redirect_to(back)
Run Code Online (Sandbox Code Playgroud)


小智 0

目前测试套件没有任何解决这个问题的方法。redirect_to(:back)但是从到 的更改redirect_back有一个未设置 HTTP_REFERER 的情况的历史记录。如果我们正在使用,redirect_back那么我们应该为此测试边缘情况。

  1. 当设置 HTTP_REFERER 时
  2. 当未设置 HTTP_REFERER 时

在这两种情况下,我们都不能跳过设置 HTTP_REFERER,但这是有真正原因的。