如何使用Jest测试记录器功能的void模块

时间:2018-04-27 06:35:39

标签: javascript logging webpack jestjs

我一直在努力阅读为有副作用的空模块编写测试方法。

我似乎无法在我的场景中实现它,我有一个接收记录器数组的模块。这是为了允许客户端在特定场景中实现多个日志记录源,例如使用控制台并记录到持久化日志记录存储(如果需要,可以使用多个源)。

我有一个抽象层次,它通过具体合同的具体来源进行映射。

从具体类中抽象出来的类有一些逻辑可以知道要调用哪些方法,我想测试那个逻辑是否合理,但我不知道该怎么做。由于这些方法无效,我认为我可能需要致电.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。

1 个答案:

答案 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被调用它都会使用间谍,你以后可以测试它被调用。

所以现在每当