gpt4 book ai didi

javascript - 如何使用 jest 模拟从方法内部启动的构造函数

转载 作者:行者123 更新时间:2023-12-02 02:34:22 25 4
gpt4 key购买 nike

我有一个定义 2 个类的脚本,其中 1 个类从另一个类的构造函数中实例化。我如何模拟嵌套构造函数,以便测试父构造函数?

export default class Foo {
// i want to test this constructor...
constructor() {
new Bar
}
}

export class Bar {
// but mock this constructor
constructor() {}
}

此外,我试图监视 Bar 构造函数,以断言它已被调用

我尝试了几种不同的方法,但未能得到我想要的结果。我是 Jest 模拟库的新手

最佳答案

需要对模块导出语句进行一些修改。然后,我们可以使用 jest.spyOn(object, methodName)模拟 Bar 类实现的方法。看看code编译后。我们在模块导出对象中创建模拟的 Bar 并在 Foo 类中使用它。它与模拟的引用具有相同的引用。

推荐方式:

  1. 依赖注入(inject)
  2. 每个文件仅包含一个类。这样我们就可以使用 jest.mockjest.doMock 方法来模拟类,而无需修改模块导出语句。

例如

index.ts:

export default class Foo {
constructor() {
new exports.Bar();
}
}

class Bar {
constructor() {
console.log('real Bar constructor implmentation');
}
}

exports.Bar = Bar;

index.test.ts:

import * as mod from './';

console.log(mod);

describe('64549093', () => {
it('should pass', () => {
const BarConstructorMock = jest.spyOn(mod as any, 'Bar').mockImplementationOnce(() => {
console.log('fake Bar constructor implmentation');
});
new mod.default();
expect(BarConstructorMock).toBeCalled();
});
});

单元测试结果:

 PASS  src/stackoverflow/64549093/index.test.ts (9.905s)
64549093
✓ should pass (5ms)

console.log src/stackoverflow/64549093/index.test.ts:3
{ default: [Function: Foo], Bar: [Function: Bar] }

console.log src/stackoverflow/64549093/index.test.ts:8
fake Bar constructor implmentation

Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 11.751s, estimated 12s

关于jestjsTypeScript的配置,参见示例: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/64549093

关于javascript - 如何使用 jest 模拟从方法内部启动的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64549093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com