我编写了一个简单的测试来检查用户是否无法使用before_action :authenticate_user!
发布到控制器中。测试内容如下:
context 'when the user is not logged in' do
it 'returns 401' do
sign_out user
post wikis_path(params: wiki)
expect(response).to have_http_status(401)
end
end
控制台中的输出为:
Failure/Error: expect(response).to have_http_status(401)
expected the response to have status code 401 but it was 302
但是当我检查测试日志时,它确实显示 401:
Processing by WikisController#create as HTML
Parameters: {"wiki"=>{"content"=>"Some content"}}
Completed 401 Unauthorized in 4ms (ActiveRecord: 0.0ms)
此外,我可以打开浏览器,删除身份验证cookie并验证它确实响应401。
起初,我认为重定向是 Devise 行为,因为它说它在他们的评论中,但是日志或行为都没有这样做。有一个类似的(旧(问题,即用户不使用Devise,但得到相同的结果。我承认,我无法理解所有的 Devise 代码,但我能够查找并一直按照 Rails 代码中的authenticate_or_request_with_http_token
直到最后,看看它应该(在他的情况下(返回 401。
是什么导致控制台中失败的测试/输出与test.log
中记录的结果之间存在分歧?
实际上,第一个状态代码是 302(重定向(,然后下一个是 401。我不知道为什么test.log
没有显示 302。以下是重定向案例的脚本(参考: https://relishapp.com/rspec/rspec-rails/docs/matchers/have-http-status-matcher(
context 'when the user is not logged in' do
it 'returns 401' do
sign_out user
post wikis_path(params: wiki)
expect(response).to have_http_status(302)
follow_redirect!
expect(response).to have_http_status(401)
end
end