2014-10-28 232 views
0

你好,我有點在Javascript和茉莉花的經驗不足,並試圖爲JavaScript對象編寫一些簡單的測試。茉莉花測試的對象方法

var googleMap = { 
    geoCode: function(code, fn) { 
     var geocoder = new google.maps.Geocoder(); 
     geocoder.geocode({ 
      'address': code 
     }, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       fn(results[0].geometry.location); 
      } else { 
       alert("ALL IS LOST"); 
      } 
     }) 
    }, 
    render: function(LatLng) { 
     var mapOptions = { 
      zoom: 8, 
      center: LatLng 
     } 
     map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); 
     var marker = new google.maps.Marker({ 
      map: map, 
      position: LatLng 
     }); 
    } 
}; 

- 這是我的茉莉花腳本;我試圖以確保渲染函數被調用,每當我們運行的地理編碼功能...

describe("Testing of googleMap.js", function() { 
    it("Test GeoCode", function() { 
     var input = "Columbus"; 
     spyOn(googleMap, 'render'); 
     googleMap.geoCode(input, googleMap.render); 
     expect(googleMap.render).toHaveBeenCalled(); 
    }); 
}); 

每當我運行此我specRunner返回一個錯誤,聲稱期望聲稱間諜渲染已經叫,對於爲什麼它不會這樣做,我感到有些困惑......這與我試圖設置我的間諜有關,還是我無法測試的javascript對象。我很難找到類似的例子。

回答

1

對象google.maps.Geocoder的方法.geocode異步
因此,在檢查回調函數是否執行時,您沒有得到迴應,這意味着您的函數將不會被調用。

如果你想要的是測試如果函數將被調用,然後你可以做類似如下:

describe("Testing of googleMap.js", function() { 
    it("Test GeoCode", function(done) { 
     var input = "Columbus"; 
     googleMap.geoCode(input, function() { 
      // here you know that your callback function was called 
      done(); 
     }); 
    }); 
}); 

或者如果你想仍然使用模擬功能,你可以做到這一點(與茉莉花2.0):

describe("Testing of googleMap.js", function() { 
    it("Test GeoCode", function(done) { 
     var input = "Columbus"; 
     var callbackSpy = jasmine.createSpy("callback").and.callFake(function() { 
      done(); 
     }); 
     googleMap.geoCode(input, callbackSpy); 
    }); 
}); 


和您的超時錯誤給定的代碼塊,如果回調函數不會被調用

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. 


這裏是一個demo(與谷歌嘲笑地址解析器)。



這就是你如何修復你的代碼。問題是:做這樣的測試是否合理?
在單元測試中,你應該測試你的代碼與其他資源(如谷歌地理編碼器)分開的 。因此,在這種情況下,最好嘲笑地理編碼器對象,並測試模擬是否被正確的參數調用。

+0

謝謝,單元測試絕對是一種不同的思維模式 – 2014-10-29 13:21:23