Jest/Typescript:在 jest 和 Typescript 中包含私有成员的模拟类依赖项

2024-01-29

上下文:我有依赖于类 A 的类 B。我想测试类 B 的方法,该方法在内部调用类 A 的方法。现在,我想通过模拟类 A 对类 B 的方法进行单元测试。

Note 1: A 类有一些私有成员

Note 2: A类没有接口

这是我的代码结构:


class Base {

  someMethod() {
     return "Hello ";
  }

}


class A {

  private _baseClassImpl: Base;

  constructor(baseClassImpl: Base) {
     this._baseClassImpl = baseClassImpl;
  }

  getSomething() {     
     return this._baseClassImpl.someMethod() + " Something";
  }
}


class B {
  constructor(objectOfClassA: A) {
      this._objectOfClassA = objectOfClassA;

 }

 functionOfClassBToTest() {
     const returnValueFromClassA = this._objectOfClassA.getSomething();

     return returnValueFromClassA;
 }
}

到目前为止我已经尝试过:

听取建议后我之前的帖子 https://stackoverflow.com/questions/70635377/jest-typescript-mock-class-dependencies-in-jest-and-typescript我尝试编写这样的测试:


const getSomethingMock = jest.fn().mockImplementation(() => {
    return "Mock value";
});

const mockA = jest.Mocked<A> = {
   getSomething: getSomethingMock
};

test("test functionOfClassBToTest", () => {
   const classBToTest = new B(mockA);
   
   expect(classBToTest.functionofClassBToTest.toStrictEqual("Hello Something");

});

上面的代码给了我这个错误:

Type '{ getSomething: jest.Mock<any, any>; }' is not assignable is not assignable to type 'Mocked<A>'. 
Type '{ getSomething: jest.Mock<any, any>; }' is missing the following properties from type 'A': _baseClassImpl

当我尝试为 _baseClassImpl 提供模拟值时,如下所示:

const baseClassMock = jest.Mocked<Base> = {
  someMethod: jest.fn()
};

const getSomethingMock = jest.fn().mockImplementation(() => {
    return "Mock value";
});

const mockA = jest.Mocked<A> = {
   getSomething: getSomethingMock,
   _baseClassImpl: baseClassMock
};

打字稿给了我这个错误:

Type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }' is not assignable is not assignable to type 'Mocked<A>'. 

Type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }' is not assignable is not assignable to type 'A'. 

Property '_baseClassImpl' is private in type 'A' but not in type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }'

我已经尝试过我的答案以前的SO帖子 https://stackoverflow.com/questions/70635377/jest-typescript-mock-class-dependencies-in-jest-and-typescript但在与私人成员一起上课的情况下它不起作用。

一些注意事项:

Note 1: A 类包含私有成员

Note 2: A类没有接口

Note 3: 我不想在我的测试函数中初始化 A 类的对象。我只想嘲笑班级。


经过一些尝试和帮助github 仓库 https://github.com/stevenulibarri/jest-typescript-mock-reference,我能够解决这个问题。

这是供参考的代码:

测试 functionOfClassBToTest :


//Note: this can be also written as : const mockA = new (<any>A)() as jest.Mocked<A>;
const mockA = new (<new () => A>A)() as jest.Mocked<A>;

mockA.getSomething = jest.fn();

test("test functionOfClassBToTest", () => {
   
   mockA.getSomething.mockReturnValueOnce("Hello Something");

   const classBToTest = new B(mockA);
   
   expect(classBToTest.functionofClassBToTest.toStrictEqual("Hello Something");

});

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jest/Typescript:在 jest 和 Typescript 中包含私有成员的模拟类依赖项 的相关文章

随机推荐

  • 事件循环上下文中微任务和宏任务之间的区别

    我刚刚读完 Promises A 规范 并偶然发现了术语 microtask 和 Macrotask 请参阅http promisesaplus com notes http promisesaplus com notes 我以前从未听说过
  • CSP:child-src 和frame-src 已弃用

    在 CSP v2 中框架 src已被弃用 子源代码建议使用 在 CSP v3 中框架 src在未弃用和子源代码已弃用 目前 2017 年 9 月 Chrome child src 指令已被弃用 并将在 2017 年 8 月左右的 M60 中
  • 从 XML 模式生成 XML 实例 (xsd) [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 圆角仅在 svg 的一侧

    我正在尝试实现类似图表的条形图 我有以下 html 元素
  • StackExchange.Redis:获取频道订阅的数量(即 PUBSUB NUMSUB)

    有没有办法通过 StackExchange Redis 库获取特定 Redis 频道的频道订阅数量 当直接与 Redis 交互时 它将使用 PUBSUB NUMSUB 命令 http redis io commands pubsub htt
  • 波浪背景颤振辅助

    I have been struggling with this problem for the past 3ish days Basically I want the homepage of my app to have a waveli
  • AEM 6 对话框中有条件显示/隐藏字段

    我正在使用简单的创作对话框构建一个相对简单的 AEM 组件 对话框的顶部是一个选择字段 当此选择字段设置为特定项目时 我希望对话框中的某些字段消失 我研究了 Foundation Carousel 组件的实现 它使用cq dialog dr
  • C++11 中 COW std::string 实现的合法性

    我的理解是 写时复制并不是实现一致性的可行方法 std string在 C 11 中 但当最近在讨论中出现时 我发现自己无法直接支持该声明 我是否正确 C 11 不承认基于 COW 的实现std string 如果是这样 这个限制是否在新标
  • ajax请求浏览器限制

    从一个更通用的问题开始 如果是 JSON 请求 ajax 请求的响应大小是否有限制 我通过 JSON 请求传递大量数据 并在 FF3 中遇到 脚本堆栈配额已耗尽 消息 现在 FF2 中的配额为 4mb 但 FF3 中的配额为 640kb 我
  • 在批处理中,如何在输入提示字符串的开头创建空格?

    假设我有一个批处理文件 其中包含 填充 并且我想缩进提示字符串的开头以供用户输入 如果我使用空格 则运行时不会显示它 它只是忽略空间 该脚本为例 echo off echo echo echo Hi echo Please input so
  • 如何从 boost 库中取出单个元素(例如共享指针)?

    我一直在尝试一些 Boost 组件 我认为在我正在从事的项目中直接需要的唯一一个是boost shared ptr 仅仅包含所需的文件会很困难吗 shared ptr 或者至少在我的项目中包含 Boost smart ptr 目录的文件 它
  • JVM 10 规范有差异吗?

    有谁知道是否有一个版本的 Java 10 和 JVM 10 规范与以前的版本有所不同 对于 Java 8 和 Java 9 存在带有差异的规范 否则很难看出到底发生了什么变化 关于Java 9和Java 10 18 3 的区别 可以下载 J
  • 如何使用react发送表单数据

    我有一个使用此方法的 webapi public async Task
  • 禁用seam的重定向过滤器

    我正在接缝中做一个需要静态 URL 的项目 我有一个映射到 group group locale 的视图 在该页面上我有一个所谓的消息列表 每条消息都有一个按钮 用于保存对消息的更改 这与一个动作 bean 相关联 如下所示
  • 安全的正则表达式来清理序列化的 DOM?

    我正在为 JavaScript 的 replace 方法寻找几种非常安全的正则表达式模式 输入是序列化的 DOM 字符串 我想删除所有 YUI3 classNames 和 YUI3 生成的 id 属性 var resourceDOMStr
  • low_memory 和 memory_map 标志在 pd.read_csv 中做什么

    的函数签名pandas read csv除其他外 还提供以下选项 read csv filepath or buffer low memory True memory map False iterator False chunksize N
  • 如何使用 C# 使键盘按钮消息文本与其 Telegram bot API 中的标题不同

    我需要我的机器人打印与其标题不同的消息 由电报客户端在键盘按钮元素上显示 我的自定义按钮有这样的文字 Where am I 当我点击它时 它会打印在屏幕上 Where am I 还 我想要打印按钮 location 与它不同的东西text
  • 在 iPython 中使用 HDF5 文件时出现异常“HDFStore 需要 PyTables”

    我对 Python 非常陌生 正在尝试使用 HDFStore 在 pandas 中创建一个表 如下所示 store HDFStore store h5 我得到例外 Exception Traceback most recent call l
  • 使用 Google Apps 脚本 API 访问其他用户

    我对此真的很困惑 我想使用 Gmail API 使用 google apps 脚本访问和发送另一个帐户中的邮件 我已在高级 Google 服务中启用 Gmail 并在控制台上启用 API 当我使用 me 值时 以下代码有效 但当我为另一个用
  • Jest/Typescript:在 jest 和 Typescript 中包含私有成员的模拟类依赖项

    上下文 我有依赖于类 A 的类 B 我想测试类 B 的方法 该方法在内部调用类 A 的方法 现在 我想通过模拟类 A 对类 B 的方法进行单元测试 Note 1 A 类有一些私有成员 Note 2 A类没有接口 这是我的代码结构 class