当Node.js需要模块需要被存根/模拟时,编写mocha单元测试的最佳方法是什么?

时间:2016-01-28 15:17:39

标签: node.js unit-testing mocha

var config = require('../config/config');
var dynasty = require('dynasty')(config);

dynasty.list('name').then(function(resp) {
    console.log(resp);
});

我尝试使用像Sinon,proxyquire和mockery这样的库,但都没有成功。

还需要什么('王朝')(配置)?我知道它传递了存储在变量config中的值,但是有没有其他方法可以实现这一点,或者在使用其中一个测试库时传递这个值?

2 个答案:

答案 0 :(得分:1)

这些代码自带的代码是不寻常的。你通常会做的是拥有某种服务包装器,可能是这样的:

function MyService(db) {
  this._db = db;
}

MyService.prototype.getList = function (name) {
  return db.list(name);
}

module.exports = MyService;

现在你可以写一个单元测试,看起来像这样:

var assert = require('assert');
var MyService = require('./MyService');

describe('MyService', function () {
  it('should return a list', function () {
    var resolvingDb = {
      list: function () {
        return Promise.resolve([]);
      }
    };
    var instance = new MyService(resolvingDb);

    return instance.getList()
      .then(function (results) {
        assert(Array.isArray(results), 'should return db.list');
      });
  });
});

您使用单元测试来测试服务中的逻辑。

您还可以在单​​独的文件中编写集成测试,该文件使用数据库连接器的实际实例。

这有帮助吗?

答案 1 :(得分:0)

如果你的模块有一个构造函数,或者你可以这样做,并将模块作为构造函数参数,以便在测试中注入它,你可以只提供一个存根/模拟的模块实现你的考试。