如何在 TypeORM 中模拟 EntityManager?

2024-01-11

我有以下代码从我的 NestJS 服务中模拟实体管理器,它在某种程度上有效,但问题在于指定什么findOne应该返回不同的实体。

    {
      provide: getEntityManagerToken(),
      useFactory: (connection: Connection) => {
        const entityManager = {
          getRepository: jest.fn(() => {
            return {
              findOne: jest.fn().mockResolvedValue({}),
              save: jest.fn().mockResolvedValue(carData),
              createQueryBuilder: jest.fn(() => ({
                select: jest.fn().mockReturnThis(),
                from: jest.fn().mockReturnThis(),
                leftJoinAndSelect: jest.fn().mockReturnThis(),
                where: jest.fn().mockReturnThis(),
                addGroupBy: jest.fn().mockReturnThis(),
                groupBy: jest.fn().mockReturnThis(),
                getOne: jest.fn().mockResolvedValue(''),
              })),
            };
          }),
        };
        return entityManager;
      },
    },

我的服务如下代码所示:

export class CarService {
  constructor(
    @InjectEntityManager()
    private readonly entityManager: EntityManager,
  ) {
    this.carRepository = entityManager.getRepository(Car);
    this.modelRepository = entityManager.getRepository(Model);
   }
    
      const car = await this.carRepository.findOne(data.id);

      const model = await this.modelRepository.findOne(data.modelId);
 

我如何模拟 findOne 结果this.carRepository与 findOne 结果不同this.modelRepository考虑到它们都将在同一个服务中被调用。


我们有可能使用实体管理器API https://github.com/typeorm/typeorm/blob/master/docs/entity-manager-api.md创建具有多个存储库的事务,如果这些操作中的任何一个失败,这些存储库可以自动执行回滚,并且在测试中,我们可以使用单例模式来定义此实体的模拟,该实体允许我们返回这些存储库的相同实例来测试所有这些读写操作均已按预期执行。例如

import { createMock } from '@golevelup/ts-jest';
import { Test, TestingModule } from '@nestjs/testing';
import { EntityManager } from 'typeorm';

describe('MyService', () => {
  let service: MyService;
  let entityManager: EntityManager;
  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        MyService,
        { provide: EntityManager, useValue: createMock<EntityManager>() },
      ],
    }).compile();

    service = module.get(CatalogsService);
    entityManager = module.get(EntityManager);
  });
  
  it('should call a transaction correctly', async () => {
    const mockEntityManager = {
      save: jest.fn(),
      getCustomRepository: jest.fn((fn) => mockEntityManager[fn] || (mockEntityManager[fn] = createMock<typeof fn>())),
    };
    const spyTransaction = (entityManager.transaction as jest.Mock).mockImplementation((cb) => cb(mockEntityManager));
    const firstRepo: FirstRepository = mockEntityManager.getCustomRepository(SubCatalogRepository);
    const secondRepo: SecondRepository = mockEntityManager.getCustomRepository(SecondRepository);
    await service.saveSomething('MOCK DATA');

    expect(spyTransaction).toHaveBeenCalled();
    expect(firstRepo.save).toHaveBeenCalled();
    expect(secondRepo.save).toHaveBeenCalled();
    expect(mockEntityManager.save).toHaveBeenCalled();
  });
});

正如我们所看到的,使用以下方法来模拟这些外部服务(例如 TypeORM EntityManager 等)非常容易创建模拟 https://github.com/golevelup/nestjs/tree/master/packages/testing#motivation函数,它自动注入 Jest 模拟函数来替换我们的代码所依赖的外部实现,这在单元测试中应该不重要。

快乐编码!

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

如何在 TypeORM 中模拟 EntityManager? 的相关文章

  • window.onbeforeunload 在 Android Chrome 上不会触发 [alt.解决方案?]

    我开发了一个简单的聊天应用程序 我正在使用 window onbeforeunload当有人关闭选项卡 浏览器时 基本上是当用户离开房间时 通知其他用户 这是我的代码 scope onExit function scope chatstat
  • Jest - 模拟函数,从另一个文件导入

    测试的文件使用从另一个文件导入的函数 import myFunc from myFile 如何在该文件的测试中模拟该函数的返回值 我正在使用笑话 这对我有用 我不确定这是否是一个好的做法 import as myFile from myFi
  • 启用/禁用由用户输入确定的复选框

    我有一个简单的表单 用户可以在其中输入他的联系号码 如果联系号码以 07 开头 则该复选框已启用 其他我需要禁用它的复选框 我已经编写了一些代码 但我面临的问题是 当用户键入 01 时 它会被禁用 但如果他们继续在 01 之后添加任何其他数
  • 确定元素是在页面折叠上方还是下方

    我有一些页面有多个输入框 用户可以在其中输入文本 在单击 下一步 按钮之前 需要填写其中一些内容 我弹出验证错误供用户查看 但是如果问题不在页面上 我希望页面滚动到它 而不是他们必须搜索丢失 错误的字段 我有一个滚动到位 但我无法确定要滚动
  • 如何使用 Angular JS 单击时将 html 模板附加到 div/指令?

    我有这种情况
  • 一次更新猫鼬中的多个文档

    我有一个用户文档数组 每个用户都有关注者属性 它是一个数字 我只想将此属性增加 1 然后立即更新数据库中的所有这些用户文档 更多细节 在请求中 我有一组用户 id 我使用这些 id 进行查询以获取一组用户文档 const users awa
  • 通过JS Laravel访问存储目录

    有没有办法访问storage目录 该目录已经链接到publicJS 中的目录 我正在尝试制作一个上传图片的表单 验证脚本 if request gt hasFile photos marker gt photos request gt ph
  • Nodejs - 检查隐藏文件

    我正在迭代文件目录 想知道是否可以测试文件是否隐藏 目前 我只是检查文件是否以 开头或不 这适用于 Mac 也许还有 Linux 但是 我想知道如何在 Windows 上做到这一点 另外 句点会在所有版本的 Linux 中隐藏该文件吗 Th
  • 有没有办法将变量从 javascript 导入到 sass 或反之亦然?

    我正在制作一个依赖于块概念的 CSS 网格系统 所以我有一个基本文件 例如 max columns 4 block width 220px block height 150px block margin 10px 它被 mixin 使用 m
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • npm install -g expo-cli 失败并显示“EPERM:不允许操作,取消链接 '...\adb.exe'

    我在运行时收到错误 npm install g expo cli 我尝试以管理员身份重新安装节点模块 但出现相同的错误 环境 Windows 10 节点版本 10 15 3 NPM版本 6 9 0 我预计安装会发生 但出现了这样的错误 np
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • 获取点击的的DOM路径

    HTML div class lol a class rightArrow href a div 伪代码 rightArrow click function rightArrowParents this dom dom is the pse
  • 计算文本选择的 xy 位置

    我正在尝试使用 DOM 元素创建自己的文本选择 是的 我的意思是当您在此元素中选择文本时 您会在文本后面看到蓝色背景 这个想法是停止默认行为 蓝色 并使用我自己的元素来完成工作 方法是找到选择的 xy 位置 然后放置绝对定位的元素 我希望能
  • 如何在 ASP.NET MVC 3 的 Razor 视图中编码嵌入的 javascript?

    如何在以下上下文中正确编码 JavaScript 我的 JSON 对象中的值是由应用程序管理员设置的 因此我假设它们需要正确编码 对于 HTML 和 JavaScript 都是如此 我在用着System Web Script Seriali
  • JavaScript:测试与执行

    我想知道检查字符串 例如邮件 密码等 的最佳方法是什么 i exec a vs i test a exec返回值 test true test 1 way var mail req body mail if check mail exec
  • 从节点服务器访问 Google Calendar API

    由于某种原因 我很难访问 Google 日历 我希望能够在 Node js 服务器的日历中添加和删除事件 我从文件中发现了非常矛盾的信息 我跟着 https developers google com identity protocols
  • 强制输入数字小数位

    我想强制
  • 无法使用 HTML 设置未定义 jQuery UI 自动完成的属性“_renderItem”

    我使用以下代码将 jQuery UI 自动完成项呈现为 HTML 这些项目在自动完成控件中正确呈现 但我不断收到此 JavaScript 错误并且无法移动过去 Firefox 无法转换 JavaScript 参数 Chrome 无法设置未定

随机推荐

  • Visual Basic 6.0 的转换工具比较 [关闭]

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

    我正在尝试从 Access 2010 将表 Final2 导出为 CSV 文件 生成的 CSV 文件带有引号 如何从 CSV 文件中删除引号 我尝试使用 ImportExport Text 宏 该宏的 VBA 代码如下所示 Function
  • 自动布局问题:iOS 7 与 iOS8

    我正在尝试创建一个可折叠的工具栏 其工作方式如下 在 iOS 7 中运行 出于可视化目的 颜色丑陋等 However when I run the code in iOS 8 this is what happens I have set
  • 关于std::add_pointer的实现的一个问题

    From std add pointer https en cppreference com w cpp types add pointer 可能的实施 namespace detail template
  • 更改 momentjs 对象上的事件触发

    对于我的一个项目 我正在监听模型对象的属性更改 并在其属性更改时调用视图方法 问题是我的模型的属性之一是 momentjs 日期对象 我研究了主干源代码 似乎它使用下划线方法触发了设置器中的更改 isEqual 看完之后下划线文档 http
  • Flux 存储将更改发送到特定的 React 组件而不是所有组件。

    努力寻找或想出一个优雅的答案 如果我有多个动态反应组件正在侦听一个通量存储以更新其子组件 是否可以发出对特定组件的更改 而不是向注册以侦听该存储上的更改的所有组件发出更改 例如 动态组件有一个按钮 单击时它会告诉通量存储将一些数据发送到 A
  • 3rd 方媒体播放器 SDK 或其他选项

    我正在为我经常访问的多媒体网站编写一个应用程序 但遇到了问题 获取视频流 URL 封装在 mp4 容器中的 h264 并尝试使用本机视频播放器播放它后 失败 这是在我的 Moto Droid 上运行的 运行 2 2 BB 和 2 3 CM7
  • graph.facebook feed 返回一个空数组

    提前致谢 有人可以帮我理解为什么 facebook feed 返回一个空数组吗 data 您需要一个带有 read stream 的用户访问令牌来存储用户帖子 此外 查询的用户需要授予应用程序 read stream 权限 您当前正在使用应
  • 为什么新的 ASP.NET Identity 表停止使用 Guid(唯一标识符类型)作为键?

    我试图理解为什么新的 ASP NET Identity 表停止使用Guid 唯一标识符类型 作为键 相反 它现在使用nvarchar 128 但仍保留一个Guid as a string 这不是一种巨大的浪费吗 uniqueidentifi
  • 如何使用代码备份/恢复 PostgreSQL?

    我努力了this http www codeproject com Articles 37154 PostgreSQL PostGis Operations方法 但它不起作用任何人都可以纠正它或分享一些教程Backup Restore Po
  • Tapestry mixin 究竟是如何工作的?

    我读完后才意识到本文 http tapestry apache org component mixins html我无法向自己解释它是如何工作的以及它可以解决什么问题 是的 它可以用来改变现有组件的行为 但如何限制呢 我能做什么 不能做什么
  • 字典上的 json.dumps,其中键字节为字节

    尝试使用 json dumps 将具有字节类型键的字典对象转换为 json 字典对象的格式事先未知 使用 json dumps 时找到了具有字节值的数组或字典的解决方案 将列表 或字典 中嵌入的字节转换为 str 以与 json dumps
  • OpenCV 2.3 无法编译,未定义的引用错误

    我在 Windows 7 64 位和 Netbeans 7 0 中使用 OpenCV 我尝试使用 MinGW 和 cygwin 编译下一个代码 但都因未定义的引用而失败 当我使用 MAT 或 FLANN 等时 我无法编译 但我添加了所有库
  • WordPress API 按类别获取帖子

    是否可以按类别获取所有帖子 http codex wordpress org XML RPC WordPress API Posts http codex wordpress org XML RPC WordPress API Posts
  • 在身份验证配置中找不到 Pod 执行角色或不具有所有必需的权限。我该如何调试?

    客观的 我希望能够使用 Fargate 部署 AWS EKS 我已经成功地进行了部署node group 然而 当我转而使用 Fargate 时 Pod 似乎都陷入了挂起状态 我当前的代码是什么样的 我正在使用 Terraform 进行配置
  • 在asp.net中发送邮件

    我正在使用 asp net 3 5 和 C 我想从 asp net 发送邮件 因为我从我的托管提供商处获得了一些详细信息 这些是 邮件 MySite net UserName Password 但我无法通过这些详细信息发送邮件 我在 web
  • Oracle TO_DATE 不工作

    我有这个查询不返回任何行 但有些记录的日期大于 90 年 6 月 25 日 为什么它不起作用 SELECT employee id last name hire date FROM employees WHERE hire date gt
  • C- SIGUSR1 在语法上到底是什么

    当我在kill 或signal 函数中使用SIGUSR1时 它在做什么 是宏吗 我读到它是用户定义的 但它是在哪里定义的 我可以制作 SIGUSR10 或以编程方式制作不同信号类型的 数组 吗 用户定义的信号意味着这些信号没有明确的含义 与
  • 使用 apache mod proxy 删除基本身份验证标头

    我有一个 HTTP Basic 安全网站 我用 mod proxy 隐藏了 Tomcat 应用程序服务器 我可以删除 HTTP Basic 标头吗 Tomcat应用程序读取标头并返回401未授权 不需要基本身份验证 因为应用程序使用 coo
  • 如何在 TypeORM 中模拟 EntityManager?

    我有以下代码从我的 NestJS 服务中模拟实体管理器 它在某种程度上有效 但问题在于指定什么findOne应该返回不同的实体 provide getEntityManagerToken useFactory connection Conn