javascript – SpyOn一个没有正确间谍的模拟开玩笑模块

我有简单的服务,我需要使用jest进行单元测试:

代码的关键是:

 domtoimage.toBlob(node, {filter: filter})
    .then(function (blob) {
      FileSaver.saveAs(blob, fileName);
 });

我已经编写了我的单元测试模块:

import FileSaver from "file-saver";
import domtoimage from "dom-to-image";


jest.mock('dom-to-image', () => {
  return {
    toBlob: (arg)=>{
      let promise = new Promise((resolve, reject) => {
        resolve('myblob')
      });
      return promise;
    }
  }
});
jest.mock('file-saver', ()=>{
  return {
    saveAs: (blob, filename) =>{
      return filename;
    }
  }
});

在我的测试中,我有以下间谍设置

const spy = jest.spyOn(FileSaver,’saveAs’);

并调用我的测试功能.

但是,expect语句:expect(spy).toBeCalled()返回false:

期待(jest.fn()).toBeCalled()

但是,在webstorm中,当我调试单元测试时,我可以清楚地看到我的模拟函数被调用(在函数内部达到了断点).

我错过了什么?

最佳答案
建议1

也许spyOn和模块模拟不能很好地结合在一起.您可以尝试直接在模块mock中使用jest.fn()

jest.mock('file-saver', ()=>{
  return {
    saveAs: jest.fn((blob, filename) => {
      return filename;
    })
  }
});

然后

expect(FileSaver.saveAs).toBeCalled()

记得在测试之间调用jest.clearAllMocks()或类似的.

建议2
我遇到了jest.mock在使用jest模块缓存时以意想不到的方式工作的问题,尤其是在使用单例导入时.也许你有这个问题.如果文件保护程序和dom-to-image没有任何状态初始化或导入时间的副作用,你应该能够交换jest.mock来覆盖你需要模拟的函数.

beforeEach(() => {
  FileSaver.saveAs = jest.fn(...);
  domtoimage.toBlob = jest.fn(...);
})

转载注明原文:javascript – SpyOn一个没有正确间谍的模拟开玩笑模块 - 代码日志