как сбросить модуль, импортированный между тестами

скажем, у меня есть модуль, который нужно инициализировать один раз в начале приложения (для передачи конфигурации). модуль будет выглядеть примерно так:

MyModule.js

let isInitiazlied;

const myModule = {

    init: function() {
        isInitiazlied = true;
    },
    do: function() {
        if (!isInitiazlied)
            throw "error"
        //DO THINGS
    }
}

export default myModule;

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

Мой модуль.test.js

import myModule from './MyModule'

describe('MyModule', () => {
    describe('init', () => {
        it('not throws exception when called', () => {
            expect(() => myModule.init()).not.toThrow();
        });
    })
    describe('do', () => {
        it('throw when not init', () => {
            expect(() => myModule.do()).toThrow();
        });
    })
})

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

Есть ли способ решить эту проблему (другой шаблон модуля/тестовый пример)?


person Amico    schedule 26.02.2018    source источник


Ответы (2)


Вы должны повторно импортировать или повторно запросить свой модуль. Проверьте документ или этот выпуск для получения дополнительной информации:

https://github.com/facebook/jest/issues/3236

https://facebook.github.io/jest/docs/en/jest-object.html#jestresetmodules

describe('MyModule', () => {
    beforeEach(() => {
        jest.resetModules()
    });

    describe('init', () => {
        const myModule = require('./MyModule');

        it('not throws exception when called', () => {
            expect(() => myModule.init()).not.toThrow();
        });
    })
    describe('do', () => {
        const myModule = require('./MyModule');

        it('throw when not init', () => {
            expect(() => myModule.do()).toThrow();
        });
    })
})
person ltamajs    schedule 26.02.2018
comment
работает ! Спасибо. единственное, чего не хватало, так это добавления .default в оператор require, поскольку MyModule экспортируется по умолчанию. - person Amico; 26.02.2018

Решение @ltamajs отлично подходит для require, но в случае, если вы используете import, вы получите следующую ошибку.

SyntaxError: /path/to/test/file.js: 'import' and 'export' may only appear at the top level

Чтобы решить эту проблему, вы можете использовать подключаемый модуль babel-plugin-dynamic-import-node, а затем сбросить модули. В целом это выглядит так:

describe('MyTests', () => {
  let MyModule;

  beforeEach(() => {
    return import('../module/path').then(module => {
      MyModule = module;
      jest.resetModules();
    });
  });

  test('should test my module', () => {
    expect(MyModule.aMethod).not.toBeUndefined();
  });
});

Источник: https://github.com/facebook/jest/issues/3236#issuecomment-698271251

person Lucio    schedule 24.09.2020