首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpyOn,一个被嘲弄的玩笑模块,没有正确地监视

SpyOn,一个被嘲弄的玩笑模块,没有正确地监视
EN

Stack Overflow用户
提问于 2018-06-12 05:12:32
回答 2查看 7K关注 0票数 9

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

代码的关键是:

代码语言:javascript
复制
 domtoimage.toBlob(node, {filter: filter})
    .then(function (blob) {
      FileSaver.saveAs(blob, fileName);
 });

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

代码语言:javascript
复制
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:

expect(jest.fn()).toBeCalled()

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

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-14 01:29:03

因此,对于你们中那些想知道一些事情的人来说,similar...my问题(正如我所怀疑的)是domtoimage.toBlob(node, {filter: filter}).then()的承诺。

从本质上讲,这个承诺是在我的期望值被调用之后解决的。

为了解决这个问题,我把我的expect放在一个setTimeout后面,从而迫使它在承诺被解决后触发。

代码语言:javascript
复制
 DownloadImage('x', 'name');
  //small timeout to resolve the promise inside downldimage function
  setTimeout(()=>{
    expect(FileSaver.saveAs).toHaveBeenCalledWith('myblob', fileName);
    done();
  }, 100);
票数 0
EN

Stack Overflow用户

发布于 2018-06-12 18:15:32

建议1

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

代码语言:javascript
复制
jest.mock('file-saver', ()=>{
  return {
    saveAs: jest.fn((blob, filename) => {
      return filename;
    })
  }
});

然后

代码语言:javascript
复制
expect(FileSaver.saveAs).toBeCalled()

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

建议2我对jest.mock以意外的方式处理jest模块缓存有问题,特别是在处理单例导入时。也许你有这个问题。如果file-saverdom-to-image在导入时没有任何状态初始化或副作用,您应该能够将jest.mock替换为您需要模拟的函数的重写。

代码语言:javascript
复制
beforeEach(() => {
  FileSaver.saveAs = jest.fn(...);
  domtoimage.toBlob = jest.fn(...);
})
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50809648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档