Jest не соответствует пользовательскому типу ошибки при использовании динамического c импорта - PullRequest
4 голосов
/ 15 марта 2020

У меня определена эта пользовательская ошибка (имя файла: '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 работает в этом сценарии).

1 Ответ

0 голосов
/ 17 марта 2020

Обходной путь, который я нашел, это:

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);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...