【问题标题】:Unit testing a service with many dependencies in NestJS在 NestJS 中对具有许多依赖项的服务进行单元测试
【发布时间】:2021-09-26 18:19:28
【问题描述】:

在 Nest 中构建 API 时,我经常遇到一个问题,即特定 API 可能需要使用多个 Nest 模块才能完成工作。我想知道是否有更好的方法来构建我的模块,以便对它们进行单元测试。

例如,假设我们有一个OrderServiceOrderService 使用了一些不同的依赖项来完成它的工作:

  • 它使用ProductsService 来查找产品详细信息和价格。
  • 它使用UsersService 来查找客户信息,例如Stripe 客户ID。
  • 它使用 Typeorm 处理将 Order 写入数据库
  • 最后,假设它使用CouponsService 来查找和验证Order 的优惠券详细信息。

为了这个例子,让我们假设这 4 个依赖项中的每一个都是它自己的 Nest 模块。

在对OrdersService 进行单元测试时,我需要删除 4 个不同的依赖项。这似乎比应该做的工作要多得多,所以我意识到一定有更好的方法。

我尝试做的一件事是创建单独的帮助文件来设置每个服务模拟。这减少了使用特定依赖项的每个服务的样板数量,但您最终仍会遇到 1 个服务可能具有 4 个不同依赖项的情况。

理想情况下,我想实现一些模式或结构,这样当我测试文件时,依赖关系要么非常简单,要么自动模拟,或者特定文件一次只有 1 个依赖关系,而不会过度简化系统.

我的问题归结为:

您如何在服务中处理许多这样的依赖项,而不会导致测试函数需要您模拟 4 种以上的方法。我很想听听 Nest 特定的方法来做到这一点,但我也很欣赏任何通用的软件工程示例或模式来研究。

【问题讨论】:

    标签: unit-testing nestjs


    【解决方案1】:

    There's a pull request to allow for auto-mocking with Nest's @nestjs/testing package,但它还没有被接受(虽然正在努力!),并且有一个名为@golevelup/ts-jest 的包允许您非常快速轻松地设置对象的模拟。因此,不必定义整个 { get: jest.fn(), create: jest.fn(), ...etc } useValue 提供程序,您可以像

    const modFixture = await Test.createTestingModule({
      providers: [
        OrderService,
        {
          provide: ProductService,
          useValue: createMock<ProductService>(),
        },
        {
          provide: UserService,
          useValue: createMock<UserService>(),
        },
        ...etc
      ]
    }).compile();
    

    所有方法都将设置为jest.fn()方法,可以根据您的具体测试进行扩展

    【讨论】:

    • 这是个好消息,真的很期待在主测试包中看到它。
    • 嘿,Jay,我看了一下这个包,它看起来很棒,但我注意到 Github 链接没有指向一个 repo。我假设它目前是私人的?只是想指出这一点,以防万一是错误的!否则,看起来很容易使用。感谢您为 Nest 所做的一切工作!
    • 我不确定你说的是哪些链接
    • 在此页面上(底部)特别是github.com/golevelup/nestjs/blob/HEAD/src/mocks.spec.tsnpmjs.com/package/@golevelup/ts-jest。但是,侧边栏链接到 NPM 包上的 repo 和主页只是指向主要的 golevelup repo,它似乎不包括这个项目。
    猜你喜欢
    • 2010-12-25
    • 2013-05-10
    • 2017-11-30
    • 2017-09-03
    • 2013-09-26
    • 1970-01-01
    • 2019-04-12
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多