【问题标题】:Problem with Rspec testing sign_in (Devise) with Request and rswagRspec 使用 Request 和 rswag 测试 sign_in (Devise) 的问题
【发布时间】:2021-06-05 16:49:32
【问题描述】:

我很想将 rswag 与 rspec 一起使用来记录 REST API 并同时编写测试。 我正在尝试使用教程和文档,但我无法让 sign_in 端点正常工作 (devise - session)。

当我运行 rspec 时,我收到状态代码错误。

require 'swagger_helper'
require 'rails_helper'
require 'shared_context'

describe 'Sonaaar REST API', type: :request do

...

  path '/users/sign_in' do
    post 'Sign In' do
      tags 'Session'
      consumes 'application/json'
      produces 'application/json'
      parameter name: :user, in: :body, schema: {
        type: :object,
        properties: {
          email: { type: :string },
          password: { type: :string },
        },
        required: ['email', 'password']
      }

     response '201', 'sign in', { 'HTTP_ACCEPT' => "application/json" } do
         response '201', 'sign in', { 'HTTP_ACCEPT' => "application/json" } do
        #
        # let(:user) do
        #   create(:user,  email: 'email@domain.com', password: 'Password1')
        # end
        #Error
        # Failure/Error:
        #        raise UnexpectedResponse,
        #          "Expected response code '#{response.code}' to match '#{expected}'\n" \
        #            "Response body: #{response.body}"
        #
        #      Rswag::Specs::UnexpectedResponse:
        #        Expected response code '401' to match '201'
        #        Response body: {"error":"You need to sign in or sign up before continuing."}


        let(:user) { { user: { login: 'email@domain.com', password: 'Password1' } } }
        # Rswag::Specs::UnexpectedResponse:
        #   Expected response code '401' to match '201'
        #   Response body: {"error":"You need to sign in or sign up before continuing."}
        #   /Users/filip/.rvm/gems/ruby-2.7.1/gems/rswag-specs-2.4.0/lib/rswag/specs/r
        run_test!
      end

比我有 RSpec 错误:

1) Sonaaar REST API /users/sign_in post sign in returns a 201 response
     Failure/Error:
       raise UnexpectedResponse,
         "Expected response code '#{response.code}' to match '#{expected}'\n" \
           "Response body: #{response.body}"

     Rswag::Specs::UnexpectedResponse:
       Expected response code '401' to match '201'
       Response body: {"error":"You need to sign in or sign up before continuing."}

身份验证:JWT 令牌 内容类型:应用程序/json 堆叠/宝石:

【问题讨论】:

    标签: ruby-on-rails api rspec devise rswag


    【解决方案1】:

    正如@sam 所说,但实际上你可以只包括看守助手

    RSpec.configure do |config|
      config.include Warden::Test::Helpers
    end
    

    然后

    let(:admin) { create(:admin) } # for this case it's devise :admins
    
    before do
      login_as(admin, scope: :admin)
    end
    
    # If you want to logout admin
    after do
      logout(:admin)
    end
    
    it 'should return 200 'do
       get 'some_path_that_needs_session'
       expect(response).to have_http_status(200)
    end
    
    
    

    您可以参考 [Warden::Test::Helpers] (https://www.rubydoc.info/github/hassox/warden/Warden/Test/Helpers) 文档

    【讨论】:

      【解决方案2】:

      请求规范需要更多的帮助,而不仅仅是为功能规范工作的普通守望者助手:

      RSpec.configure do |config|
        config.include Warden::Test::Helpers
      end
      

      添加到 rails_helper 或其他文件并在 rails_helper 中要求:

      module DeviseRequestSpecHelpers
      
        include Warden::Test::Helpers
      
        def sign_in(user)
          login_as(user, scope: :user)
        end
      
        def sign_out
          logout(:user)
        end
      
      end
      

      然后在rails_helper添加

      RSpec.configure do |config|
        config.include DeviseRequestSpecHelpers, type: :request
      end
      

      您现在应该可以使用以下请求规范登录:

      context 'some context' do
        scenario 'some scenario' do
          login_as(user)
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 2013-05-30
        • 2011-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多