gpt4 book ai didi

typescript - 使用动态导入时 Jest 与自定义错误类型不匹配

转载 作者:行者123 更新时间:2023-12-03 20:56:41 36 4
gpt4 key购买 nike

我定义了这个自定义错误(文件名:'errors.ts'):

export class CustomError extends Error {
constructor(message?: string) {
super(message);
Object.setPrototypeOf(this, Error.prototype);
this.name = this.constructor.name;
}
}

我有这个模块使用那个错误(文件名:'main.ts'):

import { CustomError } from './errors';

let called = false;
export default {
throwAfterFirst: (): void => {
if (called) throw new CustomError();
called = true;
},
};

我想使用动态导入检查 jest,所以我可以调用 jest.restModule()重置 called多变的。这是测试文件:

import { CustomError } from './errors';

let main: typeof import('./main').default;
const load = async (): Promise<Main> => {
jest.resetModules();
main = (await import('./main')).default;
};

describe('Main', () => {
beforeEach(async () => {
await load();
});

it('should throw on second time', () => {
manager.throwAfterFirst();
expect(() => manager.throwAfterFirst()).toThrowError(CustomError);
});

it('should still throw on second time', () => {
manager.throwAfterFirst();
expect(() => manager.throwAfterFirst()).toThrowError(CustomError);
});
});

现在这是一半工作,因为模块确实在每次测试之前重置,但问题是 toThrowError不正确匹配,第二行的两个测试都出现以下错误:
expect(received).toThrowError(expected)

Expected constructor: CustomError
Received constructor: CustomError
.
.
.

这种奇怪的错误不会出现在常规错误中(例如,将 CustomError 替换为 TypeError )。
另外, CustomError无需动态导入即可匹配成功。
例如,以下测试可以正常工作:

import { CustomError } from './errors';
import main from './main';

describe('Main', () => {
it('should throw on second time', () => {
manager.throwAfterFirst();
expect(() => manager.throwAfterFirst()).toThrowError(CustomError);
});
});

由于我使用的是动态导入 CustomError没有被正确识别(可能不是同一个原型(prototype)?)。我在这里缺少什么,我该如何修复测试?
(我仍然想检查特定的错误,而不是使用匹配任何错误的 toThrow。顺便说一下 toThrow 适用于这种情况)。

最佳答案

我发现的解决方法是这样的:

let main: typeof import('./main').default;
let Errors: typeof import('./errors');
const load = async (): Promise<void> => {
jest.resetModules();
main = (await import('./main')).default;
Errors = await import('./errors');
};

describe('Main', () => {
beforeEach(async () => {
await load();
});

it('should throw on second time', () => {
manager.throwAfterFirst();
expect(() => manager.throwAfterFirst()).toThrowError(Errors.CustomError);
});

it('should still throw on second time', () => {
manager.throwAfterFirst();
expect(() => manager.throwAfterFirst()).toThrowError(Errors.CustomError);
});
});

关于typescript - 使用动态导入时 Jest 与自定义错误类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60697477/

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