首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用sinon和proxyquire模拟构造函数

无法使用sinon和proxyquire模拟构造函数
EN

Stack Overflow用户
提问于 2019-11-20 21:17:45
回答 1查看 1.7K关注 0票数 2

我看过几个类似的问题,但没有一个案例适合我的问题。我正在尝试模拟一个构造函数,我在其他测试中也这样做过,但在使用google-auth-library的情况下,我无法让它工作

code.js

代码语言:javascript
复制
const {OAuth2Client} = require('google-auth-library');
const keys = require('./oauth2.keys.json');

async function getRedirectUrl() {
  const oAuth2Client = new OAuth2Client(
    keys.installed.client_id,
    keys.installed.client_secret,
    keys.installed.redirect_uris[0]
  );

  const authorizeUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: 'https://www.googleapis.com/auth/bigquery',
    prompt: 'consent'
  });

  return authorizeUrl;
}

test.js

代码语言:javascript
复制
let Code = require('../code.js');

describe('code', function() {
    let generateUrlStub, tokenStub, mockClient;

    before(async () => {
      generateUrlStub = sinon.stub().returns('http://example.com');
      tokenStub = sinon.stub().returns({tokens: 'tokens'});

      mockClient = sinon.stub().returns({
        generateAuthUrl: generateUrlStub,
        getToken: tokenStub,
      });

      Code = proxyquire('../Code.js', {
        'google-auth-library': mockClient,
      });
    });

    it('should call generateAuthUrl', async function() {
      const output = await Code.getRedirectUrl();
      sinon.assert.called(generateUrlStub)
    });
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-21 14:50:58

以下是单元测试解决方案:

代码语言:javascript
复制
const { OAuth2Client } = require("google-auth-library");
const keys = {
  installed: {
    client_id: "1",
    client_secret: "client_secret",
    redirect_uris: ["http://example.com/callback"]
  }
};

async function getRedirectUrl() {
  const oAuth2Client = new OAuth2Client(
    keys.installed.client_id,
    keys.installed.client_secret,
    keys.installed.redirect_uris[0]
  );

  const authorizeUrl = oAuth2Client.generateAuthUrl({
    access_type: "offline",
    scope: "https://www.googleapis.com/auth/bigquery",
    prompt: "consent"
  });

  return authorizeUrl;
}

module.exports = { getRedirectUrl };

index.spec.js

代码语言:javascript
复制
const proxyquire = require("proxyquire");
const sinon = require("sinon");
const { expect } = require("chai");

describe("code", function() {
  let generateUrlStub, tokenStub, code;
  beforeEach(() => {
    generateUrlStub = sinon.stub().returns("http://example.com");
    tokenStub = sinon.stub().returns({ tokens: "tokens" });

    code = proxyquire("./", {
      "google-auth-library": {
        OAuth2Client: sinon.stub().callsFake(() => {
          return {
            generateAuthUrl: generateUrlStub,
            getToken: tokenStub
          };
        })
      }
    });
  });
  afterEach(() => {
    sinon.restore();
  });

  it("should call generateAuthUrl", async function() {
    const output = await code.getRedirectUrl();
    expect(output).to.be.eq("http://example.com");
    sinon.assert.called(generateUrlStub);
  });
});

100%覆盖率的单元测试结果:

代码语言:javascript
复制
  code
    ✓ should call generateAuthUrl


  1 passing (216ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |      100 |      100 |      100 |      100 |                   |
 index.js      |      100 |      100 |      100 |      100 |                   |
 index.spec.js |      100 |      100 |      100 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|

源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/58955304

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58955304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档