使用的测试框架是 jasmine
开启一个请求以连接目标数据库的写法是下面这样
let myDB = {
name: test,
version: 1
}
function openDB (name, version) {
let request = indexedDB.open(name, version);
}
openDB(myDB.name, myDB.version);
要测试上面的程式码,目前主要是这样写
执行测试前先完成以下工作,但即使是在浏览器环境下,我也要先宣告一个
window.indexedDB 物件才能让我把间谍插进去
beforeEach(async () => {
let window.indexedDB = {
open: (name, version) => {}
}
spyOn(window.indexedDB, 'open'); // 为 open 函式插入间谍
await openDB(myDB.name, myDB.version); // 实际呼叫函式,并等待完成
}
测试条件写
expect(window.indexedDB.open).toHaveBeenCalled();
expect(window.indexedDB.open).toHaveBeenCalledWith(myDB.name, myDB.version);
以上是最简单的建立数据库请求测试程式码
但之后要在 openDB 函式内,为请求加上事件处理函式,就不知道该怎么写测试程式码
把 openDB 函式改成如下
function openDB (name, version) {
let request = indexedDB.open(name, version);
request.onerror = (event) => {
console.log('error');
};
request.onsuccess = (event) => {
console.log('success');
};
request.onupgradeneeded = (event) => {
console.log('upgrade');
};
}
即使事件处理函式里面只有一行呼叫 console.log,但由于 request 是内部变量,又
必须经由触发事件才能呼叫 console.log,完全不知道该怎么撰写相关的测试程式码
试着对 console.log 插入间谍也没用
希望有人可以指点迷津