我正在测试一个模块,我想在该模块中模拟一个依赖项。如果可以的话,让我构建我的场景:
在我的模块中
myModule.prototype.func = function(callback) {
complexObj.doStuff('foo', function(err) {
callback(err, 'stuff');
});
};
所以,我试图基本上模仿complexObj
。如果我在这种情况下模拟整个对象或只是doStuff
函数,这并不重要。我们假设doStuff
做了与Web服务或文件系统交互的事情。通过依赖注入将complexObj
注入myModule
。我一直在使用Jasmine和Sinon试图模拟或存根这个对象和函数,但我没有运气,所以我采用了这样的东西,这看起来有点笨拙:
在我的规范中:
describe('Testing myModule', function() {
it('should do stuff', function() {
ComplexObj.prototype.doStuff = function(arg, callback) {
callback(null); // If no errors, 'doStuff' returns null indicating no errors
};
var complexObj = new ComplexObj();
new myModule(complexObj).func(function(err, results) {
// Set up expectations...
});
});
});
所以,正如你所看到的,我是 psuedo - 在doStuff
对象中模拟ComplexObj
函数。由于我并不关心ComplexObj
或doStuff
函数,因此我只是调用带有'null'的回调来向func
表明doStuff
中没有错误。正如我之前提到的,我觉得应该有更好的方法来解决这个问题?建议?
答案 0 :(得分:1)
使用Jasmine,你会做这样的事情:
var complexObj = {doStuff: null};
spyOn(complexObj, 'doStuff');
new myModule(complexObj).func(function(err, results) {
expect(complexObj.doStuff).toHaveBeenCalledWith(args, callback);
});
修改或者您可以在模拟的doStuff
中设置期望值:
var complexObj = {doStuff: null};
spyOn(complexObj, 'doStuff').andCallFake(function(args, callback) {
expect(args).toEqual(/*...*/);
expect(callback).toEqual(/*...*/);
callback();
});
new myModule(complexObj).func(function(err, results) {
expect(complexObj.doStuff).toHaveBeenCalled();
});