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

发布于 2022-09-07 20:41:29 字数 535 浏览 25 评论 0

问题标题

如何借助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)
  })
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

很酷不放纵 2022-09-14 20:41:29

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()});
    }
}
寂寞陪衬 2022-09-14 20:41:29

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的,只有成功回调函数的测试用例

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文