Nik*_*ykh 2 javascript jasmine jestjs
我是测试的初学者,并开始使用 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() {});
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试:
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);
});
Run Code Online (Sandbox Code Playgroud)
测试通过,但不正确。我想让它工作,所以当我更改 saveData 时,它会破坏测试。我的测试已将所有内容硬编码到其中,并且根本不依赖于 saveData。我查找了示例和教程材料,但找不到与此案例相关的任何内容。我应该采取的任何帮助或方向都会非常有帮助。
在使用 global.chrome 重构测试的帮助和正确答案之后,如下所示:
it ("should save data in local storage", () => {
bgModule.saveData();
expect(chrome.storage.local.set).toHaveBeenCalledTimes(3);
});
Run Code Online (Sandbox Code Playgroud)
最简单的方法是使用依赖注入,因此不是chrome.storage.local直接调用,而是将其作为参数传递给您的函数,然后可以轻松地在您的测试中被模拟替换。
另一种方法是将其作为全局变量添加到您的测试环境中,如下所示:
const get = jest.fn()
const set = jest.fn()
global.chrome = {
storage: {
local: {
set,
get
}
}
Run Code Online (Sandbox Code Playgroud)