promise如何使用mocha、sinon进行测试?

新手上路,请多包涵

问题标题

如何借助mocha/chai、sinon测试promise?

问题说明

假设封装了一个函数,发起异步请求任务,成功执行onSuccess、失败执行onError。同时为了避免异步任务依赖外部环境,使用sinon做替身。这种情况是否需要编写测试代码,如果需要该如何编写?

相关代码

// 如何测试?
// 发出异步任务,成功执行onSuccess,失败执行onError
module.exports = function (onSuccess, onError) {
  var p = new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve('ok')
    }, 1000)
  })

  p.then(function (response) {
    onSuccess(response)
  }).catch(function (error) {
    onError(error)
  })
}
阅读 3.2k
2 个回答

mocha本来就支持异步的, 下面是参考代码

var myModule = require('../') //引入你的模块
describe('测试myModule', function () {
    it('成功执行onSuccess', function (done) {
        myModule(function(){done()},function(){done('执行逻辑错误')});
    }
    it('出错执行onError', function (done) {
        myModule(function(){done('执行逻辑错误')},function(){done()});
    }
}

main.js:

module.exports = function(onSuccess, onError) {
  var p = new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve('ok');
    }, 1000);
  });

  p.then(function(response) {
    onSuccess(response);
  }).catch(function(error) {
    onError(error);
  });
};

main.test.js:

const request = require('./main');
const sinon = require('sinon');

const flushPromises = () => new Promise(setImmediate);

describe('1010000015955091', () => {
  let clock;
  before(() => {
    clock = sinon.useFakeTimers({ toFake: ['setTimeout'] });
  });
  after(() => {
    clock.restore();
  });
  it('should success', async () => {
    const onSuccessStub = sinon.stub();
    const onErrorStub = sinon.stub();
    request(onSuccessStub, onErrorStub);
    clock.tick(1000);
    await flushPromises();
    sinon.assert.calledWithExactly(onSuccessStub, 'ok');
  });
});

单元测试结果+测试覆盖率报告:

  1010000015955091
    ✓ should success


  1 passing (11ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   85.71 |      100 |      80 |   85.71 |                   
 main.js  |   85.71 |      100 |      80 |   85.71 | 11                
----------|---------|----------|---------|---------|-------------------

你代码中promise没有reject的部分,所以始终是resolve的,只有成功回调函数的测试用例

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题