您正在混合单元测试和端到端(e2e)测试的概念。您正在导入模块,同时直接导入单个提供程序。我假设您导入的模块之一也可以导入
ExamCacheResultService。这样,您的测试应用程序中就有两个。调用时
app.get(ExamCacheResultService),您将获得在测试模块中直接声明的实例。但是呼叫时使用的
finishApplication是另一个。确定要测试的内容并遵循以下原则:
单元测试
在单元测试中,您要测试与其他依赖项(例如
UserService或)隔离的单个提供者/控制器
UsersController。您将此提供程序及其注入的依赖项作为模拟导入。您不导入模块。
假设我们有一个
UsersService取决于的
DatabaseConnection:
export class UsersService { constructor(private connection: DatabaseConnection) {} // ...}在单元测试中,您导入
UsersService,模拟,
DatabaseConnection但 不 导入
UsersModule。
module = await Test.createTestingModule({ providers: [ UsersService, { provide: DatabaseConnection, useClass: DbConnectionMock }, ],}).compile();databaseMock = module.get(DatabaseConnection);databaseMock.findMany.mockReturnValue([]);端到端测试
在端到端测试中,您要测试整个应用程序,并由此测试您已进行单元测试的部分之间的交互。因此,您不必导入单个提供程序,而是导入一个模块,通常是
AppModule。然后,您可以覆盖单个提供程序,例如,如果您要在内存数据库中而不是实际数据库上进行测试,或者要模拟外部API的结果。
const moduleFixture = await Test.createTestingModule({ imports: [AppModule], }).overrideProvider(DatabaseConnection).useClass(InMemoryDatabaseConnection) .overrideProvider(ExternalApiService).usevalue(externalApiMock) .compile(); app = moduleFixture.createNestApplication(); externalApiMock.get.mockReturnValueonce({data: [...]}); await app.init();


