【问题标题】:REST API unit test with promise return in nodejsREST API单元测试,在nodejs中返回承诺
【发布时间】:2019-04-05 01:34:39
【问题描述】:

我在调用 REST api 并返回 Promise 对象的类中有一个函数。我能够测试 Promise 对象,但我不确定我们如何存根或模拟 rest api 调用和测试。

Token.js

class Token {

  getToken(payload) {
    let outahToken = new Promise(function (resolve, reject) {
      request('hhtps://xyz.com', function (err, res, body) {
        if (err) {
          reject(err);
        } else {
          console.log(res);
          resolve(body);
        }
      })
    });

    return outahToken;
  }
}
module.exports = Token;

Token.test.js

'use strict'

const chai = require("chai");
const expect = chai.expect;
const nock = require('nock');
const sinon = require("sinon");
const Token = require('Token');
describe('Get User tests', () => {
  let Token;
  beforeEach(() => {
    outhController = new Token();
    sinon.stub(Token, 'getToken').returns(Promise.resolve({
      name: "All"
    }));

  });

  it('Outh test', (done) => {
    Token.getToken(payload)
      .then(response => {
        expect(typeof response).to.equal('object');
        done();
      });
  });
});        

【问题讨论】:

    标签: node.js unit-testing promise sinon sinon-chai


    【解决方案1】:

    我们可以用proxyquire 模拟请求模块并检查它是否被正确的参数调用。我们需要 proxyquire,因为 request 模块会导出一个函数 request(),仅使用 Sinon 更难模拟。

    因为request方法是一个回调函数,我们可以使用Sinonyields来模拟它。

    const chai = require('chai');
    const sinon = require('sinon');
    const proxyquire = require('proxyquire');
    
    const expect = chai.expect;
    
    describe('Token test', function() {
      let outhController;
      let Token;
      let requestStub;
    
      beforeEach(() => {
        const err = null;
        const res = null;
        const body = { name: 'All' };
    
        requestStub = sinon.stub().yields(err, res, body); // create sinon for request function and return response body that we want
        Token = proxyquire('Token', { request: requestStub }) // replace original request module with our sinon stub
    
        outhController = new Token();
      });
    
      it('Outh test', (done) => {
        const payload = {};
        outhController.getToken(payload)
          .then(response => {
            sinon.assert.calledWith(requestStub, 'hhtps://xyz.com');
    
            expect(typeof response).to.equal('object');
            expect(response.name).to.equal('All');
    
            done();
          });
      });
    });
    

    希望对你有帮助

    【讨论】:

    • ,感谢您的输入,但有一个问题是我如何测试 getToekn() 方法中给出的 if 和 else 条件。要求测试代码覆盖率的原因
    • 你必须创建两个测试用例。首先是if 和其他else 案例。
    猜你喜欢
    • 2016-10-04
    • 2014-05-19
    • 2014-11-26
    • 2016-05-01
    • 2020-03-12
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 2016-05-19
    相关资源
    最近更新 更多