我正在努力转移到TDD / BDD。我有多种方法依赖外部模块的响应来履行其职责。我想在不同的情况下测试这些方法,例如,如果模块响应数据对象或错误。
这样做的一种方法是将外部模块作为属性附加到正在测试的类/模块,然后将其“存根”。这看起来有点脏,因为你最终会将所有这些其他模块附加到你的模块上。
这是一种测试依赖外部模块响应的方法的合适方法,还是有更好的方法?
我是否应该以某种方式重构我的架构以使其更容易测试?如果是这样的话?
这是我的意思的一个例子:
我-module.js
var extMod = require('external-module');
var myMod = module.exports = function () {
/* Do Stuff */
};
myMod.prototype.extMod = extMod;
myMod.prototype.someMethod = function () {
this.extMod({ /* request */ }, function () {
/* Do Stuff */
});
};
myModuleSpec.js
我在这个例子中使用了Mocha,Chai和Sinon
var chai = require('chai');
var expect = chai.expect;
var sinon = require('sinon');
var sinonChai = require('sinon-chai');
var myMod = require('../lib/my-module.js');
chai.use(sinonChai);
describe('My Module', function () {
/* Some Tests */
describe('.someMethod()', function () {
it('should do something when a data object is returned', function () {
var foo = new myMod();
var stub = sinon.stub(foo, 'extMod').returns({ id: 1, name: 'Some Name' });
var result = foo.someMethod();
expect(result).to.be.true;
});
it('should do something when an error is returned', function () {
var foo = new myMod();
var err = new Error('Something terrible happened.');
var stub = sinon.stub(foo, 'extMod').returns(err);
var result = foo.someMethod();
expect(result).to.be.false;
});
});
});
我还考虑创建一个方法,只返回传递给它的任何内容,然后运行外部方法以允许存根而不实际将外部模块附加到类。这里唯一的问题是你只能存根一个外部方法,这可能是可行的。
像这样:var extMod = require('external-module');
var myMod = module.exports = function () {
/* Do Stuff */
};
myMod.prototype.extMod = function (module) {
return module;
};
myMod.prototype.someMethod = function () {
var extModule = this.extMod(extMod);
extModule({ /* request */ }, function () {
/* Do Stuff */
});
};