首页 > 解决方案 > 当回调未作为参数传递时,如何使用 sinon 在 node.js 中对回调进行单元测试?

问题描述

var data = function (req, res, next) {
    var data;
    modelClass.getData(function (err, response) {
            data = response[0];
            req.headers[constants.DATA] = data;
            next();
        }
    });
};

我将如何在 Node.js (express.js) 中对上述函数进行单元测试,尤其是当回调没有作为参数传入时?我打算使用Sinon单元测试框架。

此处显示的示例:youtube 教程仅显示了如何在回调作为参数传递时进行测试。

标签: node.jsunit-testingsinon

解决方案


基本上我们可以在单元测试中做一些检查:

  1. 检查是否req.headers[constants.DATA]有正确的值
  2. 检查是否next被调用

这是我测试该代码的示例

const chai = require('chai');
const assert = chai.assert;
const sinon = require('sinon');

const modelClass = require('...'); // your model class file
const src = require('...'); // your source file

describe('test', function() {
  let req;
  let res;
  let next;
  const response = [100];

  beforeEach(function() {
    // we mock `req` and `next` here
    req = {
      headers: {}
    };
    next = sinon.spy();
    sinon.stub(modelClass, 'getData').yields(null, response); // for callback function, we use yields to trigger the callback
  });

  afterEach(function() {
    sinon.restore();
  })

  it('run successfully', function() {    
    src.data(req, res, next);

    assert.equal(req.headers[constants.DATA], 100);  
    assert(next.calledOnce);  
  });
});

推荐阅读