unit-testing - Nestjs overrideProvider 与单元测试中的提供者
问题描述
我在 NestJS 中看到了两种模拟服务以进行单元测试的方法,第一种与我们在真实模块中定义提供者的方式相同,例如:
const module = await Test.createTestingModule({
providers: [
UserService,
{
provide: getRepositoryToken(User),
useValue: mockUsersRepository,
}
],
}).compile();
另一种方法是overrideProvider
方法。如下:
const module = await Test.createTestingModule({
imports: [UserModule]
})
.overrideProvider(getRepositoryToken(User))
.useValue(mockUsersRepository)
.compile();
有什么区别?
解决方案
区别很简单。
使用第一种方法(提供程序数组),您可以创建自定义测试模块来测试(可能)UserService
.
使用第二种方法,您可以使用与应用程序本身相同形状的完整模块。
结果是完全一样的——你的模拟被注入到UserService
.
第一种方法更适合小型的,主要是单元测试,但这些测试也可以在完全不使用 NestJS 测试工具的情况下完成(只需手动将 mock 传递给 ctor),而第二种方法在集成测试中做得很好。
Repository 不是用来解释的好例子,但想想Logger
. 您正在执行 2 个或更多模块的一些集成测试。您不想手动创建大的测试模块(这也破坏了与模块的真实形状的联系),但您只想导入正在一起测试的模块,例如.overrideProvider
,它可以让您断言所有记录器调用跨所有测试模块。Logger
loggerMock
例子:
@Module({providers: [LoggerService], exports: [LoggerService]})
export class LoggerModule {}
@Module({imports: [LoggerModule], providers: [FooService]})
export class FooModule {}
@Module({imports: [LoggerModule], providers: [BarService]})
export class BarModule {}
@Module({imports: [FooModule, BarModule]}
export class AppModule {}
// TEST
const testModule = await Test.createTestingModule({
import: [AppModule]
})
.overrideProvider(LoggerService)
.useValue(/* your logger mock will be provided in both FooService and BarService and you can easily test all related to logs then */)
.compile();
我希望很清楚。如果没有,请发表评论,我将尝试解释更多。
推荐阅读
- php - 包括带有提交表单而不刷新页面的php页面
- django - 内联表单集在保存时返回空列表?
- node.js - 错误:无法加载 gRPC 二进制模块
- c - 遍历转换为 void* 的数组
- android - 当发布数据显示此错误 Android 改造 Expected BEGIN_OBJECT but was STRING
- r - R 连接到 SQL Server
- c# - 在 C# windows 窗体应用程序中获取浏览器的活动 url
- python - 从 `matplotlib.patches.RegularPolygon` 继承在实例化时会产生 `ValueError`
- javascript - 将 Promise.race 与数据数组结合作为参数
- swift - 从字符串创建类类型以作为具体类型传递给泛型参数 Swift