【问题标题】:expected the response to have a success status code (2xx) but it was 401期望响应具有成功状态代码 (2xx) 但它是 401
【发布时间】:2019-03-28 16:39:11
【问题描述】:

在控制器中 current_user 存在且已登录,但请求未经授权。这是为什么呢?

module ControllerMacros

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      user = FactoryBot.create(:user, company: FactoryBot.create(:company))
      sign_in user
    end
  end

end

rspec_helper.rb:

require 'spec_helper'
require 'devise'
require 'support/controller_macros'

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
  config.include Devise::Test::ControllerHelpers, type: :controller
  config.extend ControllerMacros, type: :controller
end

用户测试:

require 'rails_helper'

RSpec.describe Api::V1::UsersController do
  include Devise::Test::ControllerHelpers

  describe "GET /api/v1/users" do
    login_user

    it "should get list of users" do
      get 'index'
      expect(response).to have_http_status(:success)
    end

  end
end

错误:

失败/错误:expect(response).to have_http_status(:success)

这些测试通过并且工作正常:

   it "should have a current_user" do
      expect(subject.current_user).to_not eq(nil)
    end

    it "should be signed in" do
      expect(subject.user_signed_in?).to be true
    end

【问题讨论】:

    标签: ruby-on-rails rspec devise


    【解决方案1】:

    试试下面的代码:

    require 'rails_helper'
    
    RSpec.describe Api::V1::UsersController do
      include Devise::Test::ControllerHelpers
    
      describe "GET /api/v1/users" do
        it "should get list of users" do
          login_user
          get 'index'
          expect(response).to have_http_status(:success)
        end
    
      end
    end
    

    【讨论】:

    • login_user` 在示例中(例如 it 块)或在示例范围内运行的构造(例如 beforelet 等)中不可用。它仅适用于示例组(例如 describecontext 块)。但我不认为这是一个问题,我会编辑我的问题
    【解决方案2】:
    describe "action name or route " do
    ...omitted for brevity
     it "should get list of users" do
          get 'index',  params: {}, headers: {...some_type_of_headers e.g BASIC, JWT}
          expect(response).to have_http_status(:success)
        end
    end
    

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 2016-04-22
      • 2016-12-18
      • 2017-03-15
      • 2021-11-02
      • 2017-07-02
      • 2023-04-10
      • 2018-07-01
      • 2018-10-02
      相关资源
      最近更新 更多