Как вы сбрасываете испытуемого между тестами в шутку с машинописью? - PullRequest
2 голосов
/ 01 мая 2020

Я использую машинопись и шутки. Я пытаюсь выполнить очень простой модульный тест, но он всегда терпит неудачу. Вот мой код:

// init.ts
let initialized = false;
let secretName: string;

export function init(name: string) {
    if (initialized) {
        throw new Error("Cannot re-initialize.");
    }

    secretName = name;

    initialized = true;
}

export function getSecret(): string {
    return secretName;
}
// init.test.ts
describe("init", () => {
    async function getTestSubject() {
        return await import("./init");
    }

    it("should set the secret name properly", async () => {
        const init = await getTestSubject();
        init.init("bruce wayne");
        expect(init.getSecret()).toEqual("bruce wayne");
    });

    it("should throw an exception if initialized more than once", async () => {
        const init = await getTestSubject();

        const callInit = function() {
            init.init("bruce wayne");
        };
        callInit();
        expect(callInit).toThrowError("Cannot re-initialize.");
    });
});

Второй модульный тест не пройден из-за исключения. Когда вызывается первый callInit (), это должен быть первый раз, когда init вызывается для этого модульного теста. Тем не менее, это второй раз, когда он вызывается при рассмотрении обоих модульных тестов.

Я подумал, что при динамическом импорте объекта тестирования (например, "./init") в каждом тесте я бы избежал этой проблемы, так как я Первоначально пытался импортировать init сверху:

import {init, getSecret} from "./init";

Есть идеи как это проверить? Я думаю, что это довольно простой c тестовый пример, так что либо в шутке есть огромное ограничение, либо я просто упускаю что-то очевидное ...

Спасибо!

1 Ответ

1 голос
/ 01 мая 2020

Мне удалось заставить это работать, вызвав jest.resetModules() в beforeEach(), чтобы сбросить пространства имен модуля перед каждым тестом.

let initModule

beforeEach(() => {
  jest.resetModules()
  initModule = require('./init')
})

it('should set the secret name properly', () => {
  initModule.init('bruce wayne')
  expect(initModule.getSecret()).toEqual('bruce wayne')
})

it('should throw an exception if initialized more than once', () => {
  const callInit = () => initModule.init('bruce wayne')
  callInit()
  expect(callInit).toThrowError('Cannot re-initialize.')
})

Вы исправьте, что здесь необходимо импортировать другой модуль, потому что невозможно выполнить sh этот сброс пространства имен модуля, используя стандартный импорт ES6. Однако в приведенном выше примере я использовал, как мне кажется, более простой require() подход для этого.

Если вы используете машинопись и все же wi sh для строгого набора initModule, вы все равно можете импортируйте его, используя стандартный импорт ES6, чтобы получить тип.

import * as InitModule from './init'

let initModule: typeof InitModule
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...