Как я могу проверить модуль void для функции регистрации, используя Jest - PullRequest
0 голосов
/ 27 апреля 2018

Я пытался прочитать написание методов тестирования для пустых модулей, где есть побочный эффект.

Кажется, я не могу реализовать свою реализацию в моем сценарии, где у меня есть модуль, который принимает массив логгеров. Это позволяет клиенту реализовать несколько источников ведения журнала в определенных сценариях, таких как использование консоли и ведение журнала в постоянном хранилище ведения журнала (при необходимости несколько источников).

У меня есть уровень абстракции, который отображается через конкретные источники с тем же контрактом.

Класс, абстрагирующийся от конкретных классов, имеет некоторую логику, чтобы знать, какие методы нужно вызывать, и я хочу проверить, является ли эта логика надежной, но я не уверен, как это сделать. Поскольку эти методы недействительны, я прав, думая, что мне может потребоваться вызвать .toHaveBeenCalled , чтобы проверить наличие этих побочных эффектов?

Инициализировать регистратор

ЦСИ / index.js

import logger from "./logger";
logger.init([console]);
logger.debug("Hello debug");

Logger

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,
    ...
}

Test

Тесты / logger.test.js

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

Консольный модуль просто пишет в консоль. На мой взгляд, я не думаю, что необходимо тестировать, если это не изменится в будущем. Если бы я должен был проверить это, как я могу убедиться, что консоль была записана? Я бы воспринял это как интеграционный тест, поскольку это фактическая реализация, которая интегрируется с консолью браузера.

Я использую webpack 4.6.0 на узле 9.5.0 с jest 22.4.3.

1 Ответ

0 голосов
/ 27 апреля 2018

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 вызывается, он будет использовать шпиона, где вы позже сможете проверить, что он был вызван.

так что теперь всякий раз, когда

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