【问题标题】:Static Properties in mocked Classes are undefined? (Jest)模拟类中的静态属性未定义? (笑话)
【发布时间】:2020-12-01 05:21:20
【问题描述】:

我目前正在尝试模拟一个具有静态属性的类..

jest.mock("../../src/logger/index");
import { Logger } from "../../src/logger/index";

// ..

const LoggerMock = Logger as jest.MockedClass<typeof Logger>;

expect(LoggerMock).toHaveBeenCalledWith(Logger.level.WARN);

// ..

在模拟类之后,静态属性level 确实返回 undefined.. -> TypeError: Cannot read property 'WARN' of undefined

-> 有谁知道如何正确地mock一个类与一个静态属性

谢谢

【问题讨论】:

  • 你为什么期望类被调用?如果您希望使用Logger.level.WARN 调用某些函数,则应将函数引用传递给expect

标签: javascript typescript jestjs mocking


【解决方案1】:

首先:Jest expect 只能在 it/test 块内工作

其次,我看到您希望 Logger 被调用,但 Logger 是一个类。你应该期望一个函数使用参数调用。

例如:

// Logger.ts
export class Logger {
  static WARN() {
    // do stuff
  }
}

// Logger.spec.ts
import { Logger } from './Logger';

jest.mock('./logger');

const LoggerMock = Logger as jest.MockedClass<typeof Logger>;

it.only('should work', () => {
  LoggerMock.WARN();

  expect(LoggerMock.WARN).toHaveBeenCalledWith();
});

这个设置对我来说很好用

【讨论】:

  • 你是对的.. // .. 我的意思是缺少代码.. 我只想指出重要部分.. 而level 是 Logger 中的一个静态属性,它持有一个带有 WARN, ERROR, .. 的对象以获得关卡的视觉想象.. 我认为为了更好地理解你可以看看实际测试github.com/agile-ts/agile/blob/tests/rewrite-tests/packages/… 我不想检查一个函数是否得到调用我想知道构造函数是否被调用 -> 类被敏捷实例化
  • 关于测试构造函数和私有方法的争论,我宁愿不测试它们。但如果你需要,你应该考虑阅读blackbox testing。您应该只检查调用某些函数的结果。所以你的收获是:使用构造函数 => 检查所有公共属性是否正确,不要测试构造函数是用参数调用的。 Jest: testing constructor
  • 是的,我正在这样做作为替代方案.. 感谢您的帮助
猜你喜欢
  • 2020-09-21
  • 2019-10-19
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2021-10-29
  • 2021-10-26
相关资源
最近更新 更多