Как поиздеваться над всеми методами «меловой» библиотеки?

#javascript #unit-testing #jestjs #chalk

Вопрос:

Я использую мел для стилизации текста терминала и написал несколько вспомогательных функций для возврата chalk экземпляров:

 /* colorUtils.js */
const chalk = require("chalk");

function redUnderline(text) {
  return chalk.red.underline(text);
}
function greenUnderline(text) {
  return chalk.green.underline(text);
}

module.exports = { redUnderline, greenUnderline };
 

Чтобы протестировать вышеперечисленные функции, я использовал Jest для написания своего набора тестов:

 /* colorUtils.test.js */
const chalk = require("chalk");
const { redUnderline, greenUnderline } = require("./colorUtils");

jest.mock("chalk", () => ({
  green: {
    underline: jest.fn(),
  },
  red: {
    underline: jest.fn(),
  },
}));

describe("colorUtils", () => {
  describe("redUnderline", () => {
    it("should return a red, underlined string", () => {
      const result = redUnderline("foo");
      expect(chalk.red.underline).toHaveBeenCalledWith("foo");
    });
  });
  describe("greenUnderline", () => {
    it("should return a green, underlined string", () => {
      const result = greenUnderline("foo");
      expect(chalk.green.underline).toHaveBeenCalledWith("foo");
    });
  });
});
 

Вышеуказанный набор тестов проходит без проблем.

Однако, чтобы проверить это chalk.red.underline и chalk.green.underline правильно вызвать, мне нужно имитировать chalk использование jest.mock() со следующим кодом:

 jest.mock("chalk", () => ({
  green: {
    underline: jest.fn(),
  },
  red: {
    underline: jest.fn(),
  },
}))
 

Существует ли более компактный синтаксис jest.mock() такого рода, чтобы он издевался над всеми chalk методами экземпляра, чтобы стать jest.fn() ?

I tried using the following mock method:

 jest.mock("chalk");
 

However, the first test will fail:

     TypeError: Cannot read property 'underline' of undefined

      2 |
      3 | function redUnderline(text) {
    > 4 |   return chalk.red.underline(text);
        |                    ^
      5 | }