【问题标题】:Cannot spy on a class functions that is imported无法监视导入的类函数
【发布时间】:2020-12-27 01:36:44
【问题描述】:
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的初始化函数,因此抛出错误。

【问题讨论】:

  • 它应该是expect(classA.initialise).toHaveBeenCalled()(初始化时没有括号)。试试看。
  • @AliF50 对不起拼写错误。我的实际代码没有()。更新了问题。

标签: javascript unit-testing ecmascript-6 jestjs jasmine


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 2019-12-11
    • 2017-12-20
    • 1970-01-01
    • 2019-07-27
    • 2020-10-03
    • 2018-11-24
    相关资源
    最近更新 更多