Когда я пытаюсь использовать ручные макеты для замены функции внутри модуля 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 = () => {...
? В их случае сами модули становятся функциями.