我定义了这个自定义错误(文件名:'errors.ts'):
export class CustomError extends Error {
constructor(message?: string) {
super(message);
Object.setPrototypeOf(this, Error.prototype);
this.name = this.constructor.name;
}
}
Run Code Online (Sandbox Code Playgroud)
我有这个模块使用该错误(文件名:'main.ts'):
import { CustomError } from './errors';
let called = false;
export default {
throwAfterFirst: (): void => {
if (called) throw new CustomError();
called = true;
},
};
Run Code Online (Sandbox Code Playgroud)
我想使用动态导入来检查笑话,这样我就可以调用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);
});
});
Run Code Online (Sandbox Code Playgroud)
现在这已经成功了一半,因为模块确实在每次测试之前重置,但问题是toThrowError不正确匹配,并且我在第二行的两个测试中都收到以下错误:
expect(received).toThrowError(expected)
Expected constructor: CustomError
Received constructor: CustomError
.
.
.
Run Code Online (Sandbox Code Playgroud)
这个奇怪的错误不会出现在常规错误中(例如替换CustomError为TypeError)。
并且,CustomError无需动态导入也能匹配成功。例如,以下测试工作正常:
expect(received).toThrowError(expected)
Expected constructor: CustomError
Received constructor: CustomError
.
.
.
Run Code Online (Sandbox Code Playgroud)
由于我使用的是动态导入,因此CustomError无法正确识别(也许不是相同的原型?)。我在这里缺少什么,我该如何修复测试?
(我仍然想检查特定错误,而不是使用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);
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
964 次 |
| 最近记录: |