用jest测试chrome.storage.local.set

时间:2018-02-20 21:49:29

标签: 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() {});
}

这是我的测试:

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);
});  

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用依赖注入,因此不是直接调用chrome.storage.local,而是将其作为参数传递给函数,然后可以在测试中轻松替换为模拟。

另一种方法是将它作为全局变量添加到您的测试环境中,如下所示:

const get = jest.fn()
const set = jest.fn()
global.chrome = {
  storage: {
    local: {
      set,
      get
    }
}