Google Maps API 通常需要在 HTML 页面中通过 <script>
标签加载,但在 Mocha 测试环境中没有 HTML 文档结构,因此需要采用其他方式来加载和使用 API。
const { JSDOM } = require('jsdom');
const { window } = new JSDOM('<!DOCTYPE html>', {
url: 'http://localhost',
runScripts: 'dangerously',
resources: 'usable'
});
// 将 window 对象设为全局
global.window = window;
global.document = window.document;
// 动态加载 Google Maps API
const script = document.createElement('script');
script.src = 'https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY';
document.body.appendChild(script);
// 等待 API 加载完成
script.onload = () => {
describe('Google Maps API 测试', () => {
it('应该正确加载 Google Maps API', () => {
assert.ok(window.google);
assert.ok(window.google.maps);
});
it('可以创建地图实例', () => {
const mapDiv = document.createElement('div');
document.body.appendChild(mapDiv);
const map = new google.maps.Map(mapDiv, {
center: { lat: -34.397, lng: 150.644 },
zoom: 8
});
assert.ok(map);
});
});
run(); // 开始执行测试
};
const sinon = require('sinon');
const { expect } = require('chai');
describe('Google Maps API 测试', () => {
let googleMock;
beforeEach(() => {
// 创建 google.maps 的 mock
googleMock = {
maps: {
Map: sinon.stub().returns({}),
LatLng: sinon.stub().returns({}),
Marker: sinon.stub().returns({})
}
};
global.google = googleMock;
});
afterEach(() => {
delete global.google;
});
it('应该调用 Map 构造函数', () => {
const mapDiv = document.createElement('div');
const map = new google.maps.Map(mapDiv, {
center: { lat: -34.397, lng: 150.644 },
zoom: 8
});
expect(googleMock.maps.Map.calledOnce).to.be.true;
});
});
const puppeteer = require('puppeteer');
const { expect } = require('chai');
describe('Google Maps API 测试', () => {
let browser, page;
before(async () => {
browser = await puppeteer.launch();
page = await browser.newPage();
await page.goto('about:blank');
// 注入 Google Maps API
await page.addScriptTag({
url: 'https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY'
});
// 等待 API 加载
await page.waitForFunction(() => window.google && window.google.maps);
});
after(async () => {
await browser.close();
});
it('应该正确加载 Google Maps API', async () => {
const hasGoogleMaps = await page.evaluate(() => {
return !!window.google && !!window.google.maps;
});
expect(hasGoogleMaps).to.be.true;
});
});
| 方法 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | jsdom | 轻量级,无需真实浏览器 | 不完全模拟真实浏览器环境 | 简单测试,不需要完整地图渲染 | | Mock/Stub | 快速,不依赖网络 | 需要维护mock代码 | 单元测试,隔离测试 | | Puppeteer | 真实浏览器环境 | 较重,启动慢 | 端到端测试,需要真实渲染 |
Promise.race
设置超时限制没有搜到相关的文章