代码之家  ›  专栏  ›  技术社区  ›  Forseti

无法在Jest中模拟导入的返回值

  •  0
  • Forseti  · 技术社区  · 3 年前

    我有一个模块 random 导出了一些函数。其中包括 shuffle<T>(a: T[]): T[] 。在测试内部使用它的其他类的两个方法时,我不得不嘲笑它。所以,我做到了:

    jest.mock('./random', async () => {
      const { Foo } = await import('./Foo');
    
      return {
        ...jest.requireActual('./random'),
        shuffle: jest.fn().mockReturnValue([new Foo()]),
      };
    });
    

    mock() 是吊装的,我必须进口 Foo 内部 mock() ,异步方式。不幸的是,在进行实际测试时,我得到: TypeError: (0 , random_1.shuffle) is not a function 。实际上,从 随机的 模块未定义。

    是因为异步导入吗?如果是,我应该如何导入 Foo 绕过吊装?

    1 回复  |  直到 3 年前
        1
  •  0
  •   Forseti    3 年前

    我在复习问题时找到了解决办法。所以,分享我的知识,问答;一种风格:

    是的,问题是因为异步导入。测试是在Promise解决之前开始的。因此,解决方案是将mock放入 beforeAll() :

    describe('A suite', () => {
      beforeAll(() => {
        jest.mock('./random', async () => {
          const { Foo } = await import('./Foo');
    
          return {
            ...jest.requireActual('./random'),
            shuffle: jest.fn().mockReturnValue([new Foo()]),
          };
        });
      });
    
      test(...);
    });
    

    在继续测试之前,Jest将等待Promise的解决方案。

    推荐文章