Я понимаю, что это довольно поздно, но я просто хотел поделиться своим решением с помощью jest, так как я не был полностью удовлетворен найденными здесь решениями. Я не могу сказать, что мое решение очень элегантное и может просто скрывать некоторый запах кода, поскольку я все еще изучаю TDD, но оно работает.
В своей работе я часто хочу войти в файл, указанный через winston.transports.File(filename: "<filename>")
транспорт. Скажем, мой файл журнала info.log
Конечно, при тестировании я не хочу
- журналы, которые будут записаны в этот
info.log
info.log
будет создан, если он не существует.
Это сделано для того, чтобы избежать побочных эффектов. Ответов выше вместе с издевательством было достаточно, чтобы избежать 1., но по какой-то причине не удалось избежать 2. (почему ниже объясняется).
То, как я настраиваю свои проекты, обычно такое
src
├── app.js
├── services
│ ├── logging
│ │ ├── logger.js
│ │ └── logger_utils.js
│ ├── foo.js
│ ├── bar.js
│ └── etc.js
├── tests
│ ├── foo.test.js
│ ├── bar.test.js
│ └── etc.test.js
└── logs
└── info.log
Сосредоточьтесь в основном на файлах, связанных с журналами. logger.js
- это место, где я создаю и затем экспортирую объект Winston Logger. Затем я пишу вспомогательные функции в logger_utils.js
для модульности и упрощения тестирования.
Когда появилась моя проблема, logger.js
состояла в
problematic_logger.js
const winston = require("winston");
const path = require("path");
// define the log file directory
const log_dir = path.resolve(__dirname, "./../../logs/info.log");
// create logger
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: log_dir
})
]
});
// export it
module.exports = logger;
Затем я потребовал его в logger_utils.js
, который, в свою очередь, потребовался бы в сценариях любых других модулей. Итак, при тестировании (помимо тестирования logger_utils.js
) мне нужно только имитировать функции, содержащиеся в logger_utils.js
, и не нужно беспокоиться о logger.js
, поскольку он вызывается только logger_utils.js
.
Теперь я не совсем уверен в этом, но я думаю, что 2. определенный выше все еще не удался, несмотря на имитацию и отключение звука, потому что winston.createLogger()
все еще вызывается, и я считаю, что это создаст файл, даже если установлен флаг --silent . Я не знаю, правда ли это, но, тем не менее, приведенные выше решения не работали.
Итак, (вдохновленный этим ответом) я решил просто не создавать никаких объектов winston при тестировании . Я сделал это, изменив свой logger.js
файл на
fixed_logger.js
const winston = require("winston");
const path = require("path");
// define the log file directory
const log_dir = path.resolve(__dirname, "../../logs/info.log");
// if we are testing, don't create any winston object
if (process.env.NODE_ENV === "test") {
// export
module.exports = {};
} else {
// behave normally otherwise
// create winston logger
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: log_dir
})
]
});
// export it
module.exports = logger;
}
(NODE_ENV
автоматически устанавливается на "тест" при запуске npm test
, npm run test:watch
и т. Д.)
Нам все еще нужно что-то экспортировать, чтобы logger_utils.js не сломался при тестировании, поэтому мы экспортируем пустой объект. Это нормально, потому что над ним будут издеваться.
В любом случае, это мой первый ответ по поводу stackoverflow. Надеюсь, это было не так уж плохо, дайте мне знать, если кому-то нужны дополнительные подробности.
person
thesofakillers
schedule
03.10.2019