如何使用 Jest 测试使用粉笔的 console.log?
How to use Jest to test a console.log that uses chalk?
在我的模块中编写一个 Node CLI 我有一个 console.log
和 chalk,示例:
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]
研究:
- Console.log statements output nothing at all in Jest
我如何使用 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
模拟函数也是如此。
在我的模块中编写一个 Node CLI 我有一个 console.log
和 chalk,示例:
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]
研究:
- Console.log statements output nothing at all in Jest
我如何使用 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
模拟函数也是如此。