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



我一直在尝试阅读有关为存在副作用的无效模块编写测试方法的信息。

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

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

从具体类抽象的类有一些逻辑来知道要调用哪些方法,我想测试该逻辑是否合理,但我不确定如何做到这一点。由于这些方法是无效的,我认为我可能需要调用 .toHaveBeenCall 来检查这些副作用是否正确?

初始化记录器

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/记录器/控制台.js - 混凝土示例

function debug(message) {
console.debug(message);
}
module.exports = {
debug: debug,
...
}

测试

tests/logger.test.js

import logger from "../../src/logger";
test("logger writes information", () => {
// What should I do here?
});

控制台模块只是写入控制台。在我看来,我认为没有必要进行测试,除非将来发生变化。如果要对其进行测试,如何验证控制台是否已写入?我认为这是一个集成测试,因为它是与浏览器控制台集成的实际实现。

我在节点 4.6.0 上使用 webpack 9.5.0,开玩笑 22.4.3。

console

是一种副作用,您无法通过模拟导入来控制导入,因为它不是导入的,而是模块全局命名空间中的对象。幸运的是,您可以使用测试文件中的global对象从外部覆盖它。因此,您可以轻松地在其中设置任何您想要的内容

const debug = jest.fn()
const log = jest.fn()
const error = jest.fn()
global.console = {debug, error, log}

现在,每次调用src/logger/console.js中的console.log时,它都会使用间谍,您以后可以测试它是否被调用。

所以现在每当

最新更新