6

我正在編寫一些JavaScript模塊,用於在瀏覽器(客戶端,而不是服務器端)中運行。該模塊使用Google Maps JavaScript API如何在使用Google Maps for JS的代碼上編寫單元測試

我想通過單元測試來覆蓋我的代碼。我也希望我的測試是孤立的。我發現了severalvcr-like JSlibraries用於記錄和嘲諷Google Maps Api正在生成的HTTP請求。但他們都是Node.JS(因爲PhantomJS doesn't support using fs module)。此外,Node.JS比PhantomJS擁有更豐富和可讀的回溯。

所以我想知道如何將Google Maps Javascript API包括到我的測試中,並使用基於Node.JS的測試運行器以及如何爲我的代碼編寫測試?

P.S.我不堅持某個JS單元測試庫。它可以是Jasmine,QUnit或其他。

P.P.S它不一定是Node.JS亞軍。如果還有其他選擇,那完全沒問題!

P.P.P.S.我的目標是爲了避免以下的事情:

  1. ,以避免在測試中
  2. 互聯網連接和相應的延遲依賴,避免了因改變在谷歌服務器的一些GEO數據的測試失敗。例如:如果我使用指示,我真的不在乎它是2000米還是2001米,我只是想知道,我從Google獲得了一些適當的數據並對它進行了一些計算。

P.P.P.P.S.感謝@MichaelGeary answer我們知道Google僅保存其API的3個版本。但我不是隻關注谷歌地圖,我選擇它在這個問題,因爲它的流行/我有同樣的問題適用於任何其他地圖api,如Yandex.Maps,,Bing等。他們大多數不刪除舊的API,所以我可以修復版本並依靠不更改內部API和HTTP請求。

另外我想避免模擬地獄,因爲我的代碼非常複雜,並且使用了大量不同類型的地理對象。因此,嘲笑所有這些並且支持該代碼並不容易。它看起來像無法忍受的事情。

我的想法是在一段時間內修復API的版本(在Google案例中不長的時間),並依賴於內部HTTP請求格式的持久性。並不時刪除所有記錄的數據,以確保在現實世界中一切仍然正常。

我想讓自己成爲一個能控制我什麼時候修復我的測試的人。我不想讓Google在隨機時間隨時打破我的測試。

+0

你肯定*不想*做的一件事就是使用一個庫來記錄和重放JavaScript Maps API使用的HTTP請求。這些請求網址和回覆沒有記錄,對於Google Maps API代碼是私有的,並且可能隨時更改。您編寫的任何測試應僅基於記錄的API,否則當Google更改API內部時,您會發現測試失敗。 –

+0

@MichaelGeary,我的目標是避免幾件事情:1)避免依賴互聯網連接和相應的延遲2)避免因爲更改Google服務器上的某些GEO數據而導致測試失敗。例如:如果我使用指示,我真的不在乎它是2000米還是2001米,我只是想知道,我從Google獲得了一些適當的數據並對它進行了一些計算。所以我不想在生產或測試中重放HTTP請求。我只是想模擬所有的HTTP請求來隔離我的測試。 – petRUShka

+0

這聽起來更像我的功能測試。 Phantomjs本身並沒有API,但[Casper.js](http://casperjs.org/)會很好。 –

回答

2

錄製或模擬Maps API發出的HTTP請求肯定是一個有趣的想法!

不幸的是,和API的其他未公開的功能一樣,這些請求都是內部實現細節,隨時都可能發生變化。 Google每年推出四次API代碼的新版本,並且每隔幾周就會發布一次修補程序修訂版。任何包含HTTP請求—的API內部件—都可能從一個版本更改爲下一個版本,即使在補丁修訂中也是如此。他們保證在版本或補丁中保持穩定的唯一事情就是有記錄的API。

谷歌確實能夠爲您提供request a specific API version的能力,但它們並沒有將舊版本保留很長時間,而且它們也沒有保留舊的補丁版本。事實上,任何時候都只有三個版本在線。在撰寫本文時,這些版本可供使用:

  • 實驗版本,當前是3.21.4。
  • 發佈版本,目前3.20.12。
  • 凍結版本,目前3.19.19。

當下一個實驗版本(3.22)推出時,3.21將成爲發佈版本,3.20凍結版本和3.19將退役並不再可用。

凍結的版本確實與版本和試驗版本有一點不同:它不再接收任何補丁,因此它完全穩定。假定凍結版本所做的HTTP請求不會改變應該是安全的。但這隻有在該版本退役時纔有所幫助。

這是一個fiddle來試驗請求不同的API版本並顯示實際加載的版本。代碼如下所示:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Google Maps API version test</title> 
</head> 

<body> 
    <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script> 
    <script src="http://maps.google.com/maps/api/js?v=3.18&sensor=false"></script> 

    <div id="version"></div> 

    <script> 
     $('#version').text(
      'google.maps.version is ' + 
      google.maps.version 
     ); 
    </script> 

</body> 
</html> 

小提琴使用v=3.18參數的地圖API的腳本URL請求版本3.18,但它實際上在這一刻加載版本19年3月19日。您可以將v=參數更改爲不同的值以查看加載哪個API版本。 (除了特定編號的版本,你也可以用v=3來獲取當前穩定版本,或v=3.exp得到目前的實驗版本。)

眼尖的讀者可能會注意到,google.maps.version財產這個代碼顯示本身是無證!但是,嘿,這是實驗測試代碼。 :-)

HTTP請求從一個版本轉換到另一個版本是相當普遍的,甚至可能在修補程序版本中進行更改。從上面的列表可以看出,3.19版經歷了19個補丁修訂版,3.20經歷了12個補丁修訂版。

如果您想爲您的Maps API代碼編寫單元測試,我的建議是模擬記錄的Maps API本身,而不是嘲笑它的任何內部。例如,您的模擬google.maps.Map可以檢查其第一個參數是否爲DOM節點,並且其第二個(可選)對象參數僅包含具有這些屬性的合法值的已知屬性。

當然,Maps API公開了相當多的對象,方法和屬性,但是您不必嘲笑整個事物,只是您正在使用的部分。

+0

感謝您的詳細解答!我只是想說:1)我認爲在一些簡單的情況下嘲笑API幾乎可以,但在我的情況下,我應該嘲笑很多(我正在指導和步驟等)!這將是支持這樣的代碼, 2)我也會遇到同樣的問題:沒有人保證數據表示的持久性(例如某些對象的地址或座標)。 3)我不是隻專注於谷歌地圖,我選擇他們在這個問題,因爲它的知名度;我有同樣的問題適用於任何其他地圖(其中大多數不刪除舊apis)。查看更新 – petRUShka

相關問題