Rails 5.2 中的零响应对象,RSpec-Rails 3.7 GET 请求规范
nil response object in Rails 5.2, RSpec-Rails 3.7 spec for GET request
我一直在努力解决这个问题,感觉我可能犯了一个简单的错误,但我找不到关于这个问题的任何信息。
我有一些 Rails 5 的请求规范,当我测试重定向时——但不是渲染的模板——我得到一个错误,undefined method 'response_code' for nil:NilClass
。原因似乎是调用匹配器时 @response
是 nil
(在 ActionDispatch::Assertions::ResponseAssertions 代码中,不在我的代码中)。我能够使用 cURL 向 API 发出请求,它 return 是预期的响应。 returned 的错误点在这里(这是 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
的值时,它确实 return 一个 Rack::MockResponse 对象,所以这在某种程度上没有被传递。
非常感谢我能得到的任何帮助!
我相信你可能已经解决了这个问题,但是对于任何可能偶然发现这个问题的人来说,我们 运行 遇到了同样的事情(response
在请求方式之后没有被分配制作 - get
或 post
,没有尝试其他方法,但假设它们都是相同的)。一直有效的现有请求规范全部开始失败。
我们案例中的罪魁祸首被追踪到 rails_helper.rb
中所需的模块,并添加到 rspec 的 config.include
列表中:
config.include ApiHelper, type: request
AppHelper
内部是根本原因:
include Rack::Test::Methods
评论那条线(最终对我们来说,删除整个助手,因为它不是真正需要的)将请求规范恢复到他们以前的工作状态。
tl;博士:
确保您没有无意中在 config.include
中为您的 rspec 配置包含 Rack::Test::Methods
。
这对我来说很愚蠢,但我敢打赌其他人或我自己会不小心这样做。
如果 type: :request
已在您的顶部块中设置,还要确保您没有意外覆盖块中的 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
。
请记住一点,您可能永远不会像这样搞砸,但以防万一。
我一直在努力解决这个问题,感觉我可能犯了一个简单的错误,但我找不到关于这个问题的任何信息。
我有一些 Rails 5 的请求规范,当我测试重定向时——但不是渲染的模板——我得到一个错误,undefined method 'response_code' for nil:NilClass
。原因似乎是调用匹配器时 @response
是 nil
(在 ActionDispatch::Assertions::ResponseAssertions 代码中,不在我的代码中)。我能够使用 cURL 向 API 发出请求,它 return 是预期的响应。 returned 的错误点在这里(这是 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
的值时,它确实 return 一个 Rack::MockResponse 对象,所以这在某种程度上没有被传递。
非常感谢我能得到的任何帮助!
我相信你可能已经解决了这个问题,但是对于任何可能偶然发现这个问题的人来说,我们 运行 遇到了同样的事情(response
在请求方式之后没有被分配制作 - get
或 post
,没有尝试其他方法,但假设它们都是相同的)。一直有效的现有请求规范全部开始失败。
我们案例中的罪魁祸首被追踪到 rails_helper.rb
中所需的模块,并添加到 rspec 的 config.include
列表中:
config.include ApiHelper, type: request
AppHelper
内部是根本原因:
include Rack::Test::Methods
评论那条线(最终对我们来说,删除整个助手,因为它不是真正需要的)将请求规范恢复到他们以前的工作状态。
tl;博士:
确保您没有无意中在 config.include
中为您的 rspec 配置包含 Rack::Test::Methods
。
这对我来说很愚蠢,但我敢打赌其他人或我自己会不小心这样做。
如果 type: :request
已在您的顶部块中设置,还要确保您没有意外覆盖块中的 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
。
请记住一点,您可能永远不会像这样搞砸,但以防万一。