【问题标题】:Mock factory using jest in typescript在 typescript 中使用 jest 模拟工厂
【发布时间】: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


    【解决方案1】:

    我通过修改here提出的问题设法解决了这个问题

    这样说:

    jest.mock("winston", () => ({
      createLogger: jest.fn().mockReturnValue({
        debug: jest.fn(),
        warning: jest.fn()
      })
    }));
    

    在测试的顶部,createLogger,我现在可以跟踪logger.warning 被调用了多少次

    【讨论】:

      猜你喜欢
      • 2018-07-23
      • 2021-01-13
      • 2021-09-11
      • 2021-01-03
      • 2018-12-18
      • 1970-01-01
      • 2019-08-11
      • 2021-04-14
      • 1970-01-01
      相关资源
      最近更新 更多