如何使用 Jest 测试使用粉笔的 console.log?

How to use Jest to test a console.log that uses chalk?

在我的模块中编写一个 Node CLI 我有一个 console.logchalk,示例:

console.log(
  chalk.green(`${delta}:`),
  chalk.white(`\nAPI: ${apiPath}`),
)

当我 运行 一个 Jest 代码覆盖率 --coverage 我被提醒我没有测试所以我写道:

test(`Test console log`, async () => {
  await mod(params)
  await expect(console.log).toBe(`${delta}:\nAPI: ${apiPath}`)
})

但我收到以下错误:

Expected: "string"
Received: [Function log]

我尝试的第二次研究尝试:

test(`Test console log`, async () => {
  await mod(params)
  await expect(console.log).toHaveBeenCalledWith(`${delta}:\nAPI: ${apiPath}`)
})

但我收到以下错误:

Received has type:  function
Received has value: [Function log]

研究:

我如何使用 Jest 测试使用粉笔的 console.log

// newTest.js

const chalk = require('chalk');

function functionUnderTest() {
  console.log(chalk.green(`${delta}:`), chalk.white(`\nAPI: ${apiPath}`));
}

module.exports = functionUnderTest;


// newTest.test.js

const functionUnderTest = require('./newTest');
const chalk = require('chalk');

jest.mock('chalk', () => ({
  green: jest.fn(),
  white: jest.fn(),
}));

it('calls console.log and chalk.blue with correct arguments', () => {
  const spy = jest.spyOn(global.console, 'log');
  chalk.green.mockReturnValueOnce('test-blue');
  chalk.white.mockReturnValueOnce('test-white');

  functionUnderTest(5, 'my-path');

  expect(chalk.green).toHaveBeenCalledWith('5:');
  expect(chalk.white).toHaveBeenCalledWith('\nAPI: my-path');
  expect(global.console.log).toHaveBeenCalledWith('test-blue', 'test-white');

  spy.mockRestore();
});

要访问全局对象,您必须使用全局上下文 ()。 您可以通过监视 console 全局对象的 log 方法来做到这一点。

关于测试本身的重要部分是需要模拟 2 个依赖项,console.log(在间谍中完成)和 chalk(我使用 jest.mock),我说它有一个名为 green 的 属性,这是一个模拟函数(和 white)。这里应该测试的是 console.log 打印从 chalk.green 调用返回的内容。因此,分配一个虚拟字符串作为 chalk.green 调用 (test-result) 的结果,并断言 console.log 是用相同的字符串调用的。 white 模拟函数也是如此。