У меня определена эта пользовательская ошибка (имя файла: '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, используя динамический импорт c, чтобы я мог вызвать 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
может быть успешно сопоставлено без динамических c импорт. Например, следующий тест работает нормально:
import { CustomError } from './errors';
import main from './main';
describe('Main', () => {
it('should throw on second time', () => {
manager.throwAfterFirst();
expect(() => manager.throwAfterFirst()).toThrowError(CustomError);
});
});
Поскольку я использую Dynami, c import CustomError
не распознается правильно (возможно, не тот же прототип?). Что мне здесь не хватает, и как я могу исправить тест?
(я все еще хочу проверить конкретную c ошибку и не использовать toThrow
, которая соответствует какой-либо ошибке. BTW toThrow
работает в этом сценарии).