如何在 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? 的相关文章

随机推荐

  • 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