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

相关问题