我是一个非常初学的测试人员并且开始使用jest。这个函数我已经将数据保存在chrome.storage.local中,我想测试chrome.storage.local是否调用了3次。这是功能:
saveData: function(){
chrome.storage.local.set({'blackList': bgModule.blackList}, function() {});
chrome.storage.local.set({'pastDays': bgModule.pastDays}, function() {});
chrome.storage.local.set({'websiteList': bgModule.websiteList}, function() {});
}
这是我的测试:
const bgModule = require("../../app/Background/background.js");
const chrome = {
storage: {
local: {
set: function() {},
get: function() {}
}
}
};
let blackListStub = bgModule.blackList;
let pastDaysStub = [
{day: "day1"},
{day2: "day2"},
{day3: "day3"}];
let websiteListStub = [
{websiteName: "facebook.com"},
{websiteName: "stackoverflow.com"},
{websiteName: "github.com"}];
it ("should save data in local storage", () => {
spyOn(bgModule, 'saveData');
bgModule.saveData();
const spy = spyOn(chrome.storage.local, 'set');
spy({'blackList' : blackListStub});
spy({'pastDays' : pastDaysStub});
spy({'websiteList' : websiteListStub});
expect(spy).toHaveBeenCalledWith({'blackList' : blackListStub});
expect(spy).toHaveBeenCalledWith({'pastDays' : pastDaysStub});
expect(spy).toHaveBeenCalledWith({'websiteList' : websiteListStub});
expect(bgModule.saveData).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledTimes(3);
});
测试通过,但不正确。我想让它工作,所以当我更改saveData时,它将破坏测试。我所拥有的测试已将所有内容硬编码到其中并且根本不依赖于saveData。我查找了示例和教程材料,但无法找到适用于此案例的任何内容。我应该采取的任何帮助或方向都会非常有帮助。
使用global.chrome重构测试后,帮助和正确答案如下所示:
it ("should save data in local storage", () => {
bgModule.saveData();
expect(chrome.storage.local.set).toHaveBeenCalledTimes(3);
});
答案 0 :(得分:2)
最简单的方法是使用依赖注入,因此不是直接调用chrome.storage.local
,而是将其作为参数传递给函数,然后可以在测试中轻松替换为模拟。
另一种方法是将它作为全局变量添加到您的测试环境中,如下所示:
const get = jest.fn()
const set = jest.fn()
global.chrome = {
storage: {
local: {
set,
get
}
}