pet*_*hka 8 javascript google-maps unit-testing google-maps-api-3 node.js
我正在编写一些旨在在浏览器中运行的JavaScript模块(客户端,而不是服务器端).此模块正在使用Google Maps JavaScript API.
我希望通过单元测试来覆盖我的代码.我也希望我的测试能够被隔离.我发现了几个 类似vcr的JS 库,用于记录和模拟Google Maps Api正在生成的HTTP请求.但所有这些都是针对Node.JS的(因为PhantomJS不支持使用fs模块).此外,Node.JS具有比PhantomJS更丰富和可读的回溯.
所以我想知道如何将Google Maps Javascript API包含在基于Node.JS的测试运行器的测试中以及如何为我的代码编写测试?
PS我不会坚持某些JS单元测试库.它可以是Jasmine,QUnit或任何其他.
PPS没必要是Node.JS的跑步者.如果还有其他选择,那就完全没问题!
PPPS我的目标是避免以下事情:
PPPPS感谢@MichaelGeary的回答,我们知道Google只保存了3个版本的API.但是我并不专注于谷歌地图,我选择它是因为它的受欢迎程度/我有同样的问题应用于任何其他地图api,如Yandex.Maps,Leaflet(与openstreet),Bing等.大多数它们不会删除旧的API,因此我可以修复版本并依赖于不更改内部API和HTTP请求.
另外我想避免模拟地狱,因为我的代码非常复杂并且使用了许多不同类型的地理对象.因此,模拟所有这些并支持该代码并不容易.看起来像是无法忍受的事情.
我的想法是修复API的版本已经有一段时间了(在谷歌案例中不是很长时间)并且依赖于内部HTTP请求格式的持久性.并不时删除所有记录的数据,以确保在现实世界中一切都还行.
我希望自己能成为控制我何时应该修复考试的人.我不想谷歌在随机的时刻打破我的测试.
记录或模拟Maps API发出的 HTTP 请求无疑是一个有趣的想法!
不幸的是,与 API 的任何其他未记录的功能一样,这些请求是内部实现细节,可能随时更改。Google 每年推出四次 API 代码的新版本,并且每隔几周就会进行一次补丁修订。任何 API 内部结构(包括 HTTP 请求)都可能从一个版本更改为下一个版本,即使在补丁修订版中也是如此。他们唯一保证跨版本或补丁保持稳定的是记录的 API。
Google 确实让您能够请求特定的 API 版本,但他们不会将旧版本保留很长时间,而且根本不保留旧的补丁修订版本。事实上,任何时候都只有三个版本。在撰写本文时,以下版本可用:
当下一个实验版本(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>
Run Code Online (Sandbox Code Playgroud)
fiddle 使用v=3.18Maps API 脚本 URL 中的参数来请求版本 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可以检查其第一个参数是否为 DOM 节点,以及其第二个(可选)对象参数是否仅包含具有合法值的已知属性。
当然,Maps API 公开了大量的对象、方法和属性,但您不必模拟整个事物,只需模拟您正在使用的部分即可。
| 归档时间: |
|
| 查看次数: |
2626 次 |
| 最近记录: |