【问题标题】:How do I write RSpec tests that require an OAuth2 access token?如何编写需要 OAuth2 访问令牌的 RSpec 测试?
【发布时间】:2016-11-11 07:37:49
【问题描述】:

我正在为受 OAuth2 部分保护的 Rails API 编写 RSpec 测试。我需要编写测试,例如

  • GET ResourcesController#index
    • 当提供access_token
      • 显示资源列表
    • access_token 未提供时
      • 不返回任何内容

诸如此类。我以为我可以使用oauth2 gem,但我很快意识到通过向 Rails 应用程序发出实际的 HTTP 请求可以实现这一点。我有点迷茫,有人能指出我正确的方向吗?

编辑一些进一步的信息

我正在使用Doorkeeper 来实现 OAuth2。我的问题与我的控制器的某些方法隐藏在以下内容背后的事实有关:

before_action :doorkeeper_authorize!, only: [:update, :destroy]

验证身份验证令牌的存在和有效性。现在,这些令牌必须存在于数据库中。那么我的问题是我该怎么做

  • 将这些令牌放入数据库中(也就是我如何在 RSpec 测试中模拟正确的登录),或者
  • 欺骗 Doorkeeper(通过存根?)认为这些令牌存在并且有效?

编辑 2

找到this。在我阅读本文时,请随时添加答案。

【问题讨论】:

    标签: ruby-on-rails testing rspec oauth doorkeeper


    【解决方案1】:

    您仍然可以使用oauth2 gem,它在its own test suite 中有许多存根访问令牌的示例。如果没有明确指出的问题,您可能很难提供更多建议。

    另外,vcr gem 记录 http 交互并在测试期间播放它们。您可以记录您的实时 API 交互,然后使用回放来运行您的测试。

    更新

    在您提到 Doorkeeper 并自己找到它的文档后,这里有一个来自 same source 的示例。

    describe Api::V1::ProfilesController do
      describe 'GET #index' do
        let(:token) { double :acceptable? => true }
    
        before do
          controller.stub(:doorkeeper_token) { token }
          # allow(controller).to receive(:doorkeeper_token) {token} # => RSpec 3
        end
    
        it 'responds with 200' do
          get :index, :format => :json
          response.status.should eq(200)
        end
      end
    end
    

    存根:可以接受吗? => true 将绕过门卫过滤器,因为令牌是有效的。如果您希望返回 false,则响应状态将为 401 未授权。

    【讨论】:

    • 谢谢尼克。我看过这些例子,但我不知道如何在我的测试中重用它们。我在我的问题中添加了一些细节,希望能澄清我的立场。
    • 好的,我知道了如何将令牌模拟为有效,但是如果我想确保我的控制器在令牌无效或对用户有效时不会出现异常行为怎么办?无权执行某些操作?
    • 意味着我必须将let(:token)before do 部分移动到一个上下文中,对吧?在这种情况下,我想我的下一个问题将是针对 Doorkeeper 的开发人员——例如,如果acceptable? 返回false,控制器接收到accessible?,那么它的语义是什么?
    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 2021-07-04
    • 2012-07-10
    • 2018-07-17
    • 2013-05-03
    • 1970-01-01
    • 2021-11-10
    • 2013-03-20
    相关资源
    最近更新 更多