如何在使用Google Maps for JS的代码上编写unit testing

我正在写一些JavaScript模块,旨在在浏览器(客户端,而不是服务器端)运行。 该模块正在使用Google Maps JavaScript API 。

我想通过unit testing来覆盖我的代码。 我也希望我的testing是孤立的。 我发现了几个 类似vcr的JS 库,用于录制和嘲笑Google Maps Api生成的HTTP请求。 但所有这些都是为了Node.JS(因为PhantomJS不支持使用fs模块 )。 此外Node.JS比PhantomJS拥有更丰富和可读的回溯。

所以我想知道如何使用基于Node.JS的testing运行器将Google Maps JavaScript API包括到我的testing中,以及如何为我的代码编写testing?

PS我不会坚持一些JSunit testing库。 它可以是茉莉花,QUnit或任何其他。

PPS没必要应该是Node.JS亚军。 如果还有其他select,那完全没问题!

PPPS我的目标是避免以下事情:

  1. 避免依赖互联网连接和相应的testing延迟
  2. 以避免由于更改Google服务器上的某些GEO数据而导致testing失败。 例如:如果我使用方向,我不在乎它是2000米还是2001米,我只是想知道,我从Google得到一些适当的数据,并用它进行一些计算。

PPPPS感谢@MichaelGeary的回答,我们知道Google只保存3个版本的API。 但我不是只关注Google地图,因为它受欢迎程度,所以我select了这个问题。我有同样的问题适用于像Yandex.Maps , Leaflet(与openstreet) , Bing等任何其他地图api。大多数他们不删除旧的API,所以我可以修复版本,并依靠不改变内部的API和HTTP请求。

我也想避免模拟地狱,因为我的代码是相当复杂的,并使用了很多不同types的地理对象。 所以嘲笑所有这些并不容易,然后支持该代码。 它看起来像难以承受的事情。

我的想法是修复API的版本一段时间(在谷歌案件不长的时间),并依靠内部HTTP请求格式的持久性。 并不时删除所有logging的数据,以确保在现实世界中一切都还可以。

我希望自己成为一个能够控制自己testing的人。 我不想让Google随意打破我的testing。

       

网上收集的解决方案 "如何在使用Google Maps for JS的代码上编写unit testing"

logging或模拟Maps API提出的HTTP请求当然是一个有趣的想法!

不幸的是,像API的其他未公开的function一样,这些请求是内部实现的细节,随时都可能发生变化。 Google每年推出四次API代码的新版本,以及每几周更新的补丁程序。 任何API内部消息(包括HTTP请求)都可能从一个版本更改为下一个版本,即使在补丁修订版本中也是如此。 他们保证在版本或补丁中保持稳定的唯一事情就是logging在案的API。

谷歌确实能够请求一个特定的API版本 ,但是它们并没有保留很久以前的旧版本,而且也没有保留旧的补丁版本。 事实上,任何时候都只有三个版本。 在撰写本文时,这些版本可用:

  • 实验版本,目前3.21.4。
  • 发布版本,目前3.20.12。
  • 冻结版本,目前3.19.19。

当下一个实验版本(3.22)推出时,3.21将成为发布版本,3.20冻结版本,3.19将退休,不再可用。

冻结的版本确实与版本和实验版本有一个区别:它不再接收任何补丁,因此它是完全稳定的。 假定冻结版本所做的HTTP请求不会改变,应该是安全的。 但这只有在该版本退役之前才有所帮助。

这里是一个小提琴尝试请求不同的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> 

小提琴在Maps API脚本URL中使用v=3.18参数来请求版本3.18,但此时实际上加载了3.19.19版本。 您可以将v=参数更改为不同的值以查看加载哪个API版本。 (除了具体的编号版本,你也可以用v=3来获得当前的稳定版本,或者v=3.exp来获得当前的实验版本。)

尖锐的读者可能会注意到,这个代码显示的google.maps.version属性本身是没有文档的! 但是,嘿,这是实验testing代码。 🙂

HTTP请求从一个版本转换到另一个版本是相当普遍的,甚至有可能在一个补丁版本中进行更改。 从上面的列表可以看出,3.19版经历了19个补丁版本,3.20经历了12个补丁版本。

如果您想为您的Google Maps API代码编写unit testing,我的build议是模拟logging的Google Maps API本身,而不是嘲笑它的任何内部。 例如,您的模拟google.maps.Map可以检查其第一个参数是一个DOM节点,并且其第二个(可选)对象参数只包含这些属性具有合法值的已知属性。

当然,Maps API公开了相当多的对象,方法和属性,但是您不必嘲笑整个事情,只是将其中的部分内容嘲笑。