javascript - 如何使用 sinon 测试 mocha 中的多个回调?

标签 javascript node.js unit-testing mocha.js

我有一个带有异步代码和多个回调的函数

var f = (cb1, cb2) => {
  return new Promise((resolve, reject) => { /* ... */ });
};

在我的测试中,我用 sinon 创建了 tupies

var cb1Spy = sinon.spy();
var cb2Spy = sinon.spy();

为了测试它们是否都被称为我有一个测试

it('test', (done) => {
  var cbCount = 2;
  var checkIfDone = () => {
    if(--cbCount === 0){
      done()
    }
  };
  f(
    () => { cb1Spy; checkIfDone(); },
    () => { cb2Spy; checkIfDone(); }
  );
});

它可以工作,但感觉不对。 有关于这种测试的最佳实践吗?

最佳答案

Mocha 中的 done 回调专门用于测试异步代码,并不是直接控制成功或失败的方法。

导致测试失败的主要方法应该是抛出 Error 对象,最好带有指示失败原因的消息。 断言是如果不满足某些特定条件就会抛出此类错误的语句。有很多库可以实现此目的,其中 chai据我所知是最受欢迎的。

诗农本身comes with some assertions与其测试替身一起使用。例如,如果您想断言 cb1Spy 被调用一次,您可以这样写:

sinon.assert.calledOnce(cb1Spy);

如果您最终使用 chai,有一个不错的插件,名为 sinon-chai您可以使用它使 sinon 断言看起来更类似于 chai 的断言,从而为您的测试提供更一致的语法。如果您使用它,您可以像这样编写测试:

const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const { expect } = chai;
chai.use(sinonChai);

describe('whatever', function() {
    it('test', function() {
        let cb1Spy = sinon.spy();
        let cb2Spy = sinon.spy();

        f(cb1Spy, cb2spy);

        expect(cb1Spy).to.have.been.calledOnce;
        expect(cb2Spy).to.have.been.calledOnce;
    });
});

关于javascript - 如何使用 sinon 测试 mocha 中的多个回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580634/

相关文章:

javascript - slider 设置功能

javascript - jQuery一个div,两个url,用css做一个选择框

javascript - node.js 表达外部图片推送到客户端

java - 如何为具有私有(private)字段的类编写junit?

javascript - 如何验证 Jest 和 Enzyme 中的 React Prop ?

javascript - 在NodeJS中将Word文档转换为PDF

javascript - 使用 node.js 解密 mcrypt 编码的文本

node.js - 在 typescript 中使用 mysql 类型

javascript - 如何修复 Mongoose 模型的 deleteOne() 函数,当它不被 req.params.id 删除时?

c# - 我如何对仅由 NHibernate 设置的 protected 属性进行单元测试?