如何在使用GoogleMapsforJS的代码上编写单元测试

How to write unit test on code that is using Google Maps for JS

本文关键字:代码 单元测试 GoogleMapsforJS      更新时间:2023-09-26

我正在编写一些JavaScript模块,旨在在浏览器(客户端,而不是服务器端)中运行。本模块使用谷歌地图JavaScript API。

我想通过单元测试来覆盖我的代码。我也希望我的测试是孤立的。我发现了几个类似vcr的JS库,用于记录和嘲笑GoogleMapsApi正在生成的HTTP请求。但它们都是针对Node.JS的(因为PhantomJS不支持使用fs模块)。此外,Node.JS比PhantomJS有更丰富和可读的回溯。

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

附言:我不喜欢某些JS单元测试库。它可以是Jasmine、QUnit或任何其他。

p.p.S不需要是Node.JS runner。如果还有其他选择,那就完全可以了!

p.p.p.S.我的目标是避免以下事情:

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

p.p.p.S.感谢@MichaelGeary的回答,我们知道谷歌只保存了API的3个版本。但我并不是只关注谷歌地图,我之所以选择它,是因为它很受欢迎/我也有同样的问题适用于任何其他地图api,如Yandex.Maps、传单(带openstreet)、Bing等。它们中的大多数都不会删除旧的api,所以我可以修复版本,并依赖于不更改内部api和HTTP请求。

此外,我想避免模拟地狱,因为我的代码非常复杂,使用了很多不同类型的地理对象。因此,要模拟所有这些代码并支持这些代码并不容易。这看起来像是难以忍受的事情。

我的想法是在一段时间内修复API版本(在谷歌的情况下,修复时间不长),并依赖于内部HTTP请求格式的持久性。并不时删除所有记录的数据,以确保在现实世界中一切正常。

我希望自己能控制我什么时候该修考试。我不想谷歌在任何时候破坏我的测试。

记录或嘲笑Maps API发出的HTTP请求当然是一个有趣的想法!

不幸的是,像API的任何其他未记录的特性一样,这些请求是一个内部实现细节,随时可能更改。谷歌每年推出四次API代码的新版本,并每隔几周就对补丁进行一次修订。任何API内部构件—包括HTTP请求—可能会从一个版本更改到下一个版本,即使在补丁修订版中也是如此。他们唯一能保证跨版本或补丁程序稳定的就是有文档记录的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>

fiddle使用Maps API脚本URL中的v=3.18参数请求3.18版本,但此时它实际上加载了3.19.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的mock可以检查它的第一个参数是否是DOM节点,以及它的第二个(可选)对象参数是否只包含具有合法值的已知属性。

当然,Maps API公开了大量的对象、方法和属性,但您不必模拟整个过程,只需模拟您正在使用的部分。