ruby-on-rails Rails 5.2中的nil响应对象,RSpec-Rails 3.7规范用于GET请求

li9yvcax  于 2022-12-24  发布在  Ruby
关注(0)|答案(2)|浏览(119)

我一直在低头在这一点上,觉得我可能犯了一个简单的错误,但我还没有能够找到任何信息,这个问题。
我有一些Rails 5的请求规范,当我测试重定向时--但不是测试呈现的模板时--我得到了一个错误undefined method 'response_code' for nil:NilClass。原因似乎是当调用匹配器时@responsenil(在ActionDispatch::Assertions::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

注意第一行,其中actual参数的默认值设置为@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

测试日志中的相关行为:

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)

有趣的是,当我使用byebug检查subject的值时,它确实返回了一个Rack::MockResponse对象,所以不知何故,这没有被传递。

wgmfuz8q

wgmfuz8q1#

我相信你可能已经解决了这个问题,但是对于其他可能偶然发现这个问题的人,我们遇到了同样的事情(response在请求方式发出后没有被赋值-getpost,没有尝试其他方法,而是假设它们都是相同的)。
我们案例中的罪魁祸首被追踪到rails_helper.rb中所需的模块,并被添加到rspec的config.include列表中:

config.include ApiHelper, type: request

AppHelper内部是根本原因:

include Rack::Test::Methods

注解掉这一行(对我们来说,最终是删除整个helper,因为实际上并不需要它)将请求规范恢复到它们以前的工作状态。

TL;医生:

确保您没有在rspec配置中无意中将Rack::Test::Methods包含在config.include中。

qvk1mo1f

qvk1mo1f2#

这对我来说是相当愚蠢的,但我敢打赌别人或我自己会偶然这样做。
如果type: :request已经在你的top块中设置了,也要确保你没有意外地覆盖你的块中的response变量。
以我愚蠢的自我为例:

let(:response) { }

it 'overrides rspec\'s own dediciated response variable' do
   get your_route_here_path
   expect(response).to have_http_status(:ok)
end

结果如下:
Error: nil doesn't have property 'status'
这是因为let(:response)实际上覆盖了rspec自己的内部response
只是要记住,你可能永远不会像这样搞砸,但以防万一。

相关问题