当 Node.js 所需模块需要 stubbed/mocked 时,编写 mocha 单元测试的最佳方法是什么?
What is the best way to write mocha unit tests when Node.js required modules need to be stubbed/mocked?
var config = require('../config/config');
var dynasty = require('dynasty')(config);
dynasty.list('name').then(function(resp) {
console.log(resp);
});
我试过使用像 Sinon、proxyquire 和 mockery 这样的库,但没有成功。
还有 require('dynasty')(config) 是什么意思?我知道它正在传递存储在变量配置中的值,但是有没有其他方法可以实现这一点,或者在使用其中一个测试库时传递这个值?
如果您的模块有一个构造函数或者您可以这样做,并且将模块作为构造函数参数以便将其注入到您的测试中,您可以只提供一个 stubbed/mocked 实现你的模块在你的测试中。
该代码单独存在是不寻常的。你通常会做的是有某种服务包装器,可能是这样的:
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');
});
});
});
您使用单元测试来测试服务中的逻辑。
您还可以在单独的文件中编写集成测试,该文件使用数据库连接器的真实实例。
有帮助吗?
var config = require('../config/config');
var dynasty = require('dynasty')(config);
dynasty.list('name').then(function(resp) {
console.log(resp);
});
我试过使用像 Sinon、proxyquire 和 mockery 这样的库,但没有成功。
还有 require('dynasty')(config) 是什么意思?我知道它正在传递存储在变量配置中的值,但是有没有其他方法可以实现这一点,或者在使用其中一个测试库时传递这个值?
如果您的模块有一个构造函数或者您可以这样做,并且将模块作为构造函数参数以便将其注入到您的测试中,您可以只提供一个 stubbed/mocked 实现你的模块在你的测试中。
该代码单独存在是不寻常的。你通常会做的是有某种服务包装器,可能是这样的:
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');
});
});
});
您使用单元测试来测试服务中的逻辑。
您还可以在单独的文件中编写集成测试,该文件使用数据库连接器的真实实例。
有帮助吗?