对具有 DI 依赖项的类进行玩笑模拟

2023-12-20

各种 Jest 文档显示了“自动”模拟、“手动”模拟或ES6级 https://jestjs.io/docs/en/es6-class-mocks.html模拟(在构造函数中实例化依赖项)。

但我想使用 DI / IOC 并将依赖项注入到 ctor 中:

// IBar.ts                                           <--- mock this
export default interface IBar {
  /* ...methods... */
}

// Baz.ts                                            <--- mock this
export default class Baz {
  constructor(spam: Spam, ham: IHam) { /* ... */}
  /* ...other methods... */
}

// Foo.ts                                            <--- test this
export default class Foo {
  constructor(bar: IBar, baz: Baz) { /* ... */}
  /* ...other methods... */
}

所以我想在测试中这样做:

const barMock = jest.giveMeAMock("../../IBar");  // or jest.giveMeAMock<IBar>();
const bazMock = jest.giveMeAMock("./Baz");       // or jest.giveMeAMock<Baz>();
const foo = new Foo(bar, baz);

expect(foo.something()).toBe(true);

Jest 可以做到这一点吗?

(上面我使用了一些 TypeScript 语法,但对于 JS/ES6 和 TS 来说也是同样的问题。)


当代码转换为 JavaScript 时,TypeScript 接口就会被编译掉......

...但这绝对是可能的class.

您可以使用自动模拟模块jest.mock and Jest将保持模块的 API 表面相同,同时用空替换实现模拟函数 https://jestjs.io/docs/en/mock-function-api:

baz.js

export default class Baz {
  doSomething() {
    throw new Error('the actual function throws an error');
  }
}

foo.js

export default class Foo {
  constructor(baz) {
    this.baz = baz;
  }
  doSomething() {
    // ...
    this.baz.doSomething();
    // ...
  }
}

代码.test.js

jest.mock('./baz');  // <= auto-mock the module

import Baz from './baz';
import Foo from './foo';

test('Foo', () => {
  const baz = new Baz();  // <= baz is an auto-mocked instance of Baz
  const foo = new Foo(baz);

  foo.doSomething();  // (no error)

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

对具有 DI 依赖项的类进行玩笑模拟 的相关文章

随机推荐

  • 用于非零基数组指针分配的 C++ gcc 扩展?

    我正在寻找 gcc 支持的 C 语言扩展来启用非从零开始的数组指针的分配 理想情况下我可以简单地写 include
  • 优化 Cython 中的字符串

    我试图向我们的小组展示 Cython 在增强 Python 性能方面的优点 我已经展示了几个基准 所有这些都通过以下方式实现加速 编译现有的 Python 代码 使用 cdef 静态类型变量 特别是在内循环中 然而 我们的大部分代码都进行字
  • pyvenv 安装错误的 pip 版本

    我正在创建一个 virtualenvpyvenv env但安装的 pip 版本已过时 我可以在虚拟环境中手动更新 pip 但我希望自动获得正确的版本 没有激活 venv gt pip V pip 7 1 2 from usr lib pyt
  • 查找所有应用程序文件夹并在 Inno Setup 中安装文件

    这是一个类似的问题找到应用程序的路径 并将文件复制到 Inno Setup 中的该目录 https stackoverflow com questions 46282559 我想将文件安装到 Inno Setup 中用户的 MATLAB 文
  • 如何解读uops.info?

    我查了一下说明在 uops info 上尝试找出 1 延迟是多少 以及 2 我可以执行多少个并发负载 我在解释结果时遇到困难 下面的屏幕截图 上面也有链接 What do the different variants of the inst
  • 一旦使用pthread满足条件,for循环就不会终止

    当我发现 for 循环没有终止时 我正在编写一段多线程代码 起始代码大致是这样的 for int i V 1 tid i gt 0 i NTHREADS stuff V 和 NTHREADS 是常量 tid 是使用传递的线程 IDpthre
  • Jupyter:在不同的单元格中重新绘制

    我想做这样的事情 import matplotlib pyplot as plt matplotlib inline fig1 plt figure 1 plt plot 1 2 3 5 2 4 plt show 在一个单元格中 然后在另一
  • Swift 3 和 iOS 10 错误内存泄漏错误

    当与 iOS 10 和 Swift 3 一起使用时 Xcode 8 中似乎存在 错误的 内存泄漏错误 以下代码报告 Instruments 和 Xcode 8 内存调试器中的内存泄漏 class SomeClass NSObject var
  • Python将文本文件转换为字典

    我正在编写一个拼写检查函数 并且我有一个如下所示的文本文件 teh the cta cat dgo dog dya day frmo from memeber member 错误的拼写位于左侧 这将是我的密钥 正确的拼写位于右侧 我的值 d
  • 如何在 RxJava 中的动态列表上创建观察者?

    我需要在不断变化的数组上创建一个观察者 添加元素 我正在使用 Observable from Iterable 但它似乎在 ArrayList 上创建了 Observable 就像创建时一样 我需要通知观察者并在每次 ArrayList 添
  • 使用 ConcMarkSweepGC 的连续 CMS 收集

    在 Linux 上使用以下 JVM 选项启动 Tomcat 2cpu 4g RAM 800M ehcache 元素 Xmn512m Xmx2g Xms2g XX UseConcMarkSweepGC Xss128k XX PermSize
  • 我可以指定 MSBuild 标记的输出路径吗?

    是否可以为以下文件的输出指定不同的文件夹
  • 加入线程时处理异常的最佳方法

    出于某种原因 我对以下内容感到困惑 假设我有Thread A that 绝对地需要执行后Thread B已完成其处理 做到这一点的一种方法是Thread A加盟Thread B 简单的例子 public class MainThread p
  • android:使用默认视频播放器

    我有一个播放视频文件的应用程序 我一直在使用代码Videoview并开始Videoview手动播放视频文件 但是 我只是想知道我是否可以使用 android 的默认媒体播放器或视频播放器 而不是创建或使用VideoView播放文件 如果问题
  • 正确使用 IdUDPClient.ReceiveBuffer

    感谢您的帮助 我正在将旧版本的 Delphi 转换为 XE5 但我遇到了 Indy 组件的问题 需要使用IdUDPClient ReceiveBuffer 这是我的代码 while not Terminated do begin try l
  • 在整个站点使用 SSL [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我考虑的是为整个网站使用 SSL 而不是只选择几个页面进行 HTTPS 访问 这样做会有什么缺点 我希望允许社交服务登录 例如 Facebook
  • 从 Python 发送 HTTP POST 请求(尝试从 PHP 转换)

    我正在尝试将此代码片段从 PHP 转换为 Python 编程新手 但发现这样做很困难 我尝试转换的 PHP 如下 fp fsockopen whmcsurl 80 errno errstr 5 if fp querystring forea
  • 如何通过 __getattr__ 将参数传递给函数

    考虑以下代码示例 python 2 7 class Parent def init self child self child child def getattr self attr print Calling getattr attr i
  • ViewPager 上的左右箭头指示器

    我想在 ViewPager 上显示左右箭头 以指示滑动 我在 ViewPager 元素上添加了两个 ImageButton 但这些区域随后阻止 ViewPager 触发 滑动 我还希望按下这些箭头来触发片段相应地改变 简而言之 ImageB
  • 对具有 DI 依赖项的类进行玩笑模拟

    各种 Jest 文档显示了 自动 模拟 手动 模拟或ES6级 https jestjs io docs en es6 class mocks html模拟 在构造函数中实例化依赖项 但我想使用 DI IOC 并将依赖项注入到 ctor 中