Rails 5.2中的nil响应对象,RSpec-Rails 3.7规范的GET请求

Dan*_*der 6 rspec ruby-on-rails rack-test

我一直低着头,觉得我可能犯了一个简单的错误,但我一直无法找到有关这个问题的任何信息.

我有一些Rails 5的请求规范,当我测试重定向时 - 但不是渲染模板 - 我得到一个错误,undefined method 'response_code' for nil:NilClass.这样做的原因似乎是,@responsenil,当匹配被称为(内ActionDispatch ::断言:: ResponseAssertions代码,而不是在我的代码).我能够使用cURL向API发出请求,并按预期返回响应.返回错误的位置在这里(这是ActionDispatch代码):

def generate_response_message(expected, actual = @response.response_code)
  "Expected response to be a <#{code_with_name(expected)}>,"\
  " but was a <#{code_with_name(actual)}>"
  .dup.concat(location_if_redirected).concat(response_body_if_short)
end
Run Code Online (Sandbox Code Playgroud)

注意第一行,其中actualparam 的默认值设置为@response.response_code.

这是我的测试代码:

RSpec.describe "Admin registrations", type: :request do
  describe "new sign-up" do
    subject { get new_admin_registration_path }

    it "redirects to home" do
       expect(subject).to redirect_to(new_admin_session_path)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

测试日志中的相关行是:

Started GET "/admins/sign_up" for 127.0.0.1 at 2018-07-05 10:44:05 -0700
Processing by Admins::RegistrationsController#new as HTML
Redirected to http://example.org/admins/sign_in
Completed 301 Moved Permanently in 18ms (ActiveRecord: 0.0ms)
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我使用byebug来检查它的值时subject,它确实会返回一个Rack :: MockResponse对象,所以这不会被传递掉.

我能得到的任何帮助非常感谢!

Mic*_*ins 4

我确信您可能已经解决了这个问题,但是对于任何可能偶然发现这个问题的人来说,我们遇到了同样的事情(response在发出请求后没有被分配 - 或者getpost没有尝试其他方法,但假设它们都是一样的)。一直有效的现有请求规范都开始失败。

我们的案例中的罪魁祸首被追踪到 中所需的模块rails_helper.rb,并添加到 rspec 的config.include列表中:

config.include ApiHelper, type: request
Run Code Online (Sandbox Code Playgroud)

AppHelper根本原因在里面:

include Rack::Test::Methods
Run Code Online (Sandbox Code Playgroud)

评论该行(最终对我们来说,删除整个助手,因为它并不是真正需要的)将请求规范恢复到之前的工作状态。

长话短说:

确保您没有无意中将其包含Rack::Test::Methodsconfig.includerspec 配置中。