2011-11-30 20 views
2

我使用像這樣(的CoffeeScript)主幹網模型內google.maps庫:如何使用Sinon.JS存儲google.maps庫?

class Route extends Backbone.Model 

    initialize: -> 
    @directionsService = new google.maps.DirectionsService() 

在我的測試中,我每當我試圖實例化一個Route,我明明在運行到一個問題。如何在我的測試中將google剔除,以便它不會導致此問題?

回答

4

不太瞭解coffescript,但可以爲模型構造函數指定第二個對象作爲參數。

var mymodel = new Route({/*attributes*/}, {directionService: yourStub}); 

然後在初始化函數你可以這樣寫:

initialize: function(atts, options) { 
    this.directionService = options.directionService || new google.maps.DirectionsService(); 
} 

現在,您可以存根方向服務,或使用另外一個(如果有的話)的單個實例。當您嘗試編寫測試代碼是創建你想測試你的對象新實例

var origService = google.maps.DirectionsService; 
google.maps.DirectionsService = function() {/*your stub*/}; 
var route = new Route(); 
google.maps.DirectionsService = origService; 
+0

關於通過DirectionsService存根的好消息。謝謝 –

+0

感謝您的提示,Javascript總是讓我微笑,在我的工作馬(A.K.A:Java)中嘲笑這樣的對象,它將需要一個充滿代碼的游泳池。 –

+0

更改實現以允許測試錯過了重點 –

1

一個主要故障:

另一種方法是直接更換DirectionService。有一種調用Inversion of control的模式有助於編寫可測試的代碼。訣竅是你在類中創建的所有東西都會被注入到構造函數中。這樣做,在你的測試中,你可以注入一個簡單的模擬或存根。所以ProTom的答案就是關於這種模式。

另一種解決方案: 在JavaScript中,我們可以輕鬆地覆蓋我們自己的每個對象/函數。這意味着您可以創建自己的google.map DirectionsService。順便說一句,它會更好地測試你的代碼沒有任何依賴於其他庫,所以你應該創建自己的谷歌對象與你需要的方法。