首页 > 解决方案 > 无法监视导入的类函数

问题描述

import startUp from 'startup';
import classA from '...';
import classB from '...';

startUp.ready.then(classA.initialise(), classB.initialise());

我的测试用例:

    it('invokes its initialisation function during the import of ./initialiser', () => {
            jest.spyOn(classA, 'initialise').mockImplementation(() => {});
            jest.spyOn(classB, 'initialise').mockImplementation(() => {});
          
            // Some more test cases

            expect(classA.initialise).toHaveBeenCalledWith();
            expect(classA.initialise).toHaveBeenCalledWith();
        });

运行测试用例,它会尝试测试 classA 和 classB 的初始化函数,从而引发错误。

标签: javascriptunit-testingecmascript-6jestjsjasmine

解决方案


因为and的initialise方法在导入模块时会立即执行,所以需要在导入这些模块之前进行 mock。classAclassB

index.ts

import classA from './classA';
import classB from './classB';

classA.initialise();
classB.initialise();

classA.ts

export default {
  initialise() {},
};

classB.ts

export default {
  initialise() {},
};

index.test.ts

import classA from './classA';
import classB from './classB';

describe('63797764', () => {
  it('invokes its initialisation function during the import of ./initialiser', async () => {
    jest.spyOn(classA, 'initialise').mockImplementation(() => console.log('mocked classA initialise'));
    jest.spyOn(classB, 'initialise').mockImplementation(() => console.log('mocked classB initialise'));

    await import('./');
    expect(classA.initialise).toBeCalled();
    expect(classA.initialise).toBeCalled();
  });
});

单元测试结果:

 PASS  src/stackoverflow/63797764/index.test.ts (10.906s)
  63797764
    ✓ invokes its initialisation function during the import of ./initialiser (21ms)

  console.log src/stackoverflow/63797764/index.test.ts:6
    mocked classA initialise

  console.log src/stackoverflow/63797764/index.test.ts:7
    mocked classB initialise

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        12.367s

推荐阅读