Смежные модули используют другой кеш для ручных ссор в Jest - PullRequest
0 голосов
/ 20 января 2020

Когда я пытаюсь использовать ручные макеты для замены функции внутри модуля fs, вызов jest.mock('foo') не позволит модулю foo получить доступ к ранее установленным данным в макете fs модуль. Вот пример:

__ mocks __ / fs. js:

const fs = jest.genMockFromModule('fs');
const globalObject = {};
fs.__modifyGlobalObject = (key, value) => {
    globalObject[key] = value;
};
fs.__getGlobalObject = () => {
    return globalObject;
};
module.exports = fs;

app / index. js

const fs = require('fs');
console.log('APP: ', fs.__getGlobalObject());

tests / app.test. js:

it('', () => {
    //Making sure that everything will use our mocked implementation of the fs module
    jest.mock('fs');
    //Setting the global object in the mocked fs module
    require('fs').__modifyGlobalObject('foo', 'bar');
    //Mocking the app
    jest.mock('../app');
    const mockedApp = require('../app');
});

Вывод консоли Jest должен возвращаться: APP: { foo: 'bar' }. К сожалению, он возвращает пустой объект. Когда я комментирую или удаляю строку, где я высмеиваю модуль приложения: //jest.mock('../app'); или требую его с помощью jest.requireActual, я получаю ожидаемый результат.

Есть ли обходной путь? Если вы удивляетесь , почему я бы хотел это сделать, вот моя мотивация: я пытаюсь сделать то же самое, что и в приведенном примере . Предложенный метод позволяет мне загружать «поддельную» конфигурацию перед каждым тестом, высмеивая модуль FS и перезаписывая readFileSync в файле fs.js mock. Без него мой модуль загрузки конфигурации будет обращаться к файловой системе каждый раз, когда я запускаю тесты. Все работало безупречно, пока я не начал издеваться над моими пользовательскими модулями с jest.mock. Конечно, я мог бы смоделировать отдельные экспортируемые функции вместо целых модулей, но что мне делать с модулями, которые используют module.exports = () => {...? В их случае сами модули становятся функциями.

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