首先,我会稍微修改您的类定义(大写类名并修复数据库分配):
var Wrapper = (function() {
function Wrapper() {
this.db = require("database");
}
Wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return Wrapper;
})();
存根整个班级:
var WrapperStub = sinon.spy(function() {
return sinon.createStubInstance(Wrapper);
});
sinon.createStubInstance
将创建一个 Wrapper 实例,其中每个方法都是一个存根。sinon.spy
将允许我们监视类实例化。
所以你可以像这样锻炼它:
// verify instantiation
var wrapper = new WrapperStub();
expect(WrapperStub).to.have.been.calledWithNew;
// verify method stub
wrapper.insertUser.returns('data');
expect(wrapper.insertUser()).to.equal('data');
expect(wrapper.insertUser).to.have.been.calledOnce;
(断言使用chai和sinon-chai)
我说只是“练习一下”,因为这个代码片段不是实际的单元测试。实例化和方法调用将由您的测试对象进行。
现在,如果你想模拟一个由 require() 注入的依赖项——比如db = require('database')
在你的例子中——你可以尝试一个测试工具,比如Jest(但不使用 sinon)或我创建的受Jest启发但使用它的sinonquire sinon 加上你最喜欢的测试工具(我的是mocha)。在内部,sinonquire使用与上述相同的技术来组合sinon.spy
和sinon.createStubInstance
存根一个类。