有没有办法用Jasmine或Sinon来模拟这个功能?

时间:2012-03-22 03:09:32

标签: node.js mocking

我正在测试一个模块,我想在该模块中模拟一个依赖项。如果可以的话,让我构建我的场景:

在我的模块中

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函数。由于我并不关心ComplexObjdoStuff函数,因此我只是调用带有'null'的回调来向func表明doStuff中没有错误。正如我之前提到的,我觉得应该有更好的方法来解决这个问题?建议?

1 个答案:

答案 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();
});