2012-03-22 88 views
0

我正在測試一個模塊,我想模擬出該模塊中的依賴關係。讓我幀我的方案,如果可以的話:有沒有什麼辦法可以用Jasmine或Sinon來模擬這個功能?

在我的模塊

myModule.prototype.func = function(callback) { 
    complexObj.doStuff('foo', function(err) { 
     callback(err, 'stuff'); 
    }); 
}; 

所以,我想基本上嘲笑complexObj。在這種情況下,我是否嘲笑整個對象或僅僅是doStuff函數並不重要。我們假設doStuff做了一些類似於Web服務或文件系統的交互。 complexObj正在通過依賴注入注入myModule。我一直在使用茉莉花和詩乃試圖模擬或存根這個對象和功能,但我沒有運氣,所以我採取了這樣的,這似乎有點kludgy:

在我的規格:

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... 
     }); 
    }); 
}); 

所以,你可以看到,我ComplexObj對象-mocking了doStuff功能。由於我不關心ComplexObjdoStuff函數,我只是用'null'調用回調,指示funcdoStuff中沒有錯誤。正如我之前提到的,我覺得應該有更好的方法來處理這個問題?建議?

回答

1

茉莉,你會做這樣的事情:

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(); 
}); 
+0

是不是最好的做法,以'expect'在模擬假冒?我會假設由於'doStuff'永遠不會被調用而沒有執行的期望會導致錯誤的假設。我傾向於設置虛假的虛擬變量,並在調用函數之後期望虛擬變量的內容。 – Giszmo 2014-12-17 04:08:02

相關問題