我一直在努力阅读为有副作用的空模块编写测试方法。
我似乎无法在我的场景中实现它,我有一个接收记录器数组的模块。这是为了允许客户端在特定场景中实现多个日志记录源,例如使用控制台并记录到持久化日志记录存储(如果需要,可以使用多个源)。
我有一个抽象层次,它通过具体合同的具体来源进行映射。
从具体类中抽象出来的类有一些逻辑可以知道要调用哪些方法,我想测试那个逻辑是否合理,但我不知道该怎么做。由于这些方法无效,我认为我可能需要致电.toHaveBeenCalled来检查这些副作用吗?
的src / index.js
import logger from "./logger";
logger.init([console]);
logger.debug("Hello debug");
src / logger.js - 期望一系列混凝土的抽象
function init(loggers) {
...
}
function debug(message) {
writeToLogs(loggers, message, "debug");
}
function writeToLogs(loggers, message, type) {
// I want to test this logic - multiple loggers and different calls mapped correctly
loggers.forEach(logger => {
switch (type) {
case "debug":
logger.debug(message);
break;
...
}
}
}
module.exports = {
init: init,
debug: debug,
...
}
src / logger / console.js - 具体的例子
function debug(message) {
console.debug(message);
}
module.exports = {
debug: debug,
...
}
测试/ logger.test.js
import logger from "../../src/logger";
test("logger writes information", () => {
// What should I do here?
});
控制台模块只是写入控制台。在我看来,除非将来发生变化,否则我认为没有必要进行测试。如果我要测试它,我该如何验证控制台是否已被写入?我认为这是一个集成测试,因为它是与浏览器控制台集成的实际实现。
我在节点9.5.0上使用webpack 4.6.0,其中包含jest 22.4.3。
答案 0 :(得分:0)
console
是一个副作用,你只能通过模拟导入来控制,因为它不是导入的,而是模块全局命名空间中的对象。幸运的是,您可以使用测试文件中的global
对象从外部覆盖它。所以你可以在那里轻松设置你想要的任何东西
const debug = jest.fn()
const log = jest.fn()
const error = jest.fn()
global.console = {debug, error, log}
现在每次console.log
src/logger/console.js
被调用它都会使用间谍,你以后可以测试它被调用。
所以现在每当