【发布时间】:2020-03-18 21:53:26
【问题描述】:
我想使用 Jest 创建一个模拟的 winston 记录器实例。
这样我就可以使用依赖注入来监视logger.warning() 被调用了多少次以及出现了什么错误消息。
但是,由于 winston 使用工厂方法 createLogger(),当对 jest.mock("winston") 进行自动模拟时,它会使我对 createLogger() 的调用返回 undefined。
这是我的代码:
import { VoiceChannelDisconnect } from "./../../src/PeriodicTask/VoiceChannelDisconnect";
import { Logger, createLogger } from "winston";
import { VoiceChannel, GuildMember, Collection } from "discord.js";
jest.mock("winston");
jest.mock("discord.js");
const MockedVoiceChannel = VoiceChannel as jest.Mock<VoiceChannel>;
let voiceChannel = new MockedVoiceChannel();
let logger = createLogger();
let voiceChannelDisconnect = new VoiceChannelDisconnect(voiceChannel, logger);
it("returns true when no one is left in channel", () => {
voiceChannel = new MockedVoiceChannel();
voiceChannel.members = new Collection<string, GuildMember>();
logger = createLogger();
logger.warning = jest.fn();
voiceChannelDisconnect = new VoiceChannelDisconnect(voiceChannel, logger);
expect(voiceChannelDisconnect.execute()).toBe(true);
expect(logger.warning).toBeCalledTimes(1);
});
运行测试产生:
TypeError: Cannot set property 'warning' of undefined
15 |
16 | logger = createLogger();
> 17 | logger.warning = jest.fn();
如何创建一个仍然满足 Typescript 类型检查的模拟 Logger 实例?
提前致谢
【问题讨论】:
标签: typescript unit-testing jestjs winston