2013-07-11 47 views
0

我正在嘗試使用茉莉花做一些基本測試。我使用外部庫&我打算做的是間諜/模擬方法調用庫對象(D3),並確保在D3上調用適當的方法。茉莉花測試外部庫

 var d3Spy = jasmine.createSpyObj('d3', ['select']); 
     spyOn(window, 'd3').andReturn(d3Spy); 
     expect(d3Spy.select).toHaveBeenCalled(); 

當在對象上調用'select'時,出現此錯誤。

TypeError: Object function() { 
spyObj.wasCalled = true; 
spyObj.callCount++; 
var args = jasmine.util.argsToArray(arguments); 
spyObj.mostRecentCall.object = this; 
spyObj.mostRecentCall.args = args; 
spyObj.argsForCall.push(args); 
spyObj.calls.push({object: this, args: args}); 
return spyObj.plan.apply(this, arguments); 
} has no method 'select' 

我在做什麼錯?

回答

4

失敗在你的代碼是當你調用d3()以下

spyOn(window, 'd3').andReturn(d3Spy); 

這條線西港島線僅返回間諜。所以它用一個函數替代d3對象,當它的調用返回{select: jasmine.createSpy()}。但是,使用D3你將永遠不會調用d3()原因selectd3

靜態成員因此解決的辦法就是窺視'd3.select」

spyOn(d3, 'select') 

順便說一句。使用重鏈的庫如D3的問題是,它很難嘲笑。因此,您示例中的select間諜必須返回適合d3 Selections對象的對象,依此類推。所以有時候不要嘲笑一切。

+0

你剛纔指出了'我遇到的所有問題'。由於鏈式方法調用,事情變得更加複雜,我已經從您提出的解決方案中恢復過來。現在,我已經停止了對所有方法調用的間諜活動,並且只監視那些重要的方法調用和簡單的鏈式方法調用。 – Andy