Как смоделировать JSON файл в Jest - PullRequest
0 голосов
/ 21 апреля 2020

Я использую Jest для тестирования моего API, и когда я запускаю свои тесты, мой JSON файл results.json записывается в следующую строку в моем API app.js (чего я не хочу, чтобы это происходило):

fs.writeFile('results.json', JSON.stringify(json), (err, result) => {
    if (err) console.log('error', err);
});

Вот так выглядит мой Jest-файл:

Я попытался создать макет файла JSON и поместил его вне оператора describe, чтобы предотвратить фактический файл results.json записывается в:

jest.mock('./results.json', () => ({ name: 'preset1', JSONtask: [], JSONcomplete: [] }, { name: 'preset2', JSONtask: [], JSONcomplete: [] }));

Но это ничего не меняет. У кого-нибудь есть предложения?

Я видел другие решения подобных проблем, но они не дают ответ, который я ищу.

РЕДАКТИРОВАТЬ: Хотя нет очень хороший метод, одно из решений моей проблемы - заключить fs.writeFile в утверждение

if (process.env.NODE_ENV !== 'test') {
//code
};

, хотя это будет означать, что fs.writeFile не может быть проверено.

ПРИМЕЧАНИЕ: Я все еще принимаю ответы!

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

jest.mock(path, factory) предназначен для имитации JS модулей, а не содержимого файла.

Вместо этого следует смоделировать fs.writeFile и проверить, что он был вызван с ожидаемыми аргументами. Документы объясняют, как это сделать.

1 голос
/ 21 апреля 2020

Ваша проблема в том, что код, который вы хотите протестировать, содержит жестко запрограммированную операцию ввода-вывода, которая всегда усложняет тестирование.

Что вам нужно сделать, это изолировать зависимость от fs.writeFile, например, в нечто вроде ResultsWriter. Затем эту зависимость можно внедрить и смоделировать для целей тестирования.

Я написал обширный пример очень похожего случая с Nest JS вчера в разделе , как выполнить модульное тестирование класса, расширяющего чтение абстрактного класса. переменные окружения , которые, мы надеемся, можно адаптировать к вашим потребностям.

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