[英]nestjs unit test createTestingModule Dependency Injection
我希望你能幫助我。 我正在使用帶有最新 angular/nestjs 的 Nx(日期:2 月 26 日)
...
"@nestjs/common": "^7.0.0",
"@nestjs/config": "^0.6.3",
"@nestjs/core": "^7.0.0",
"@nestjs/platform-express": "^7.0.0",
"@nestjs/platform-socket.io": "^7.6.7",
"@nestjs/websockets": "^7.6.7",
"jest": "26.2.2",
"@nrwl/jest": "11.4.0",
...
我無法使用帶有 Jest 的 NestJS 運行單元測試我想測試以下服務:
@Injectable()
export class CoreApiService {
logger = new Logger('CoreApiService');
apiEndpoint;
constructor(private httpService: HttpService, configService: ConfigService) {
this.apiEndpoint = configService.get('API_SERVICE_ENDPOINT');
}
}
我收到以下錯誤:
TypeError: Cannot read property 'get' of undefined
所以似乎 ConfigService(以及 httpService)總是未定義的。
當記錄 httpService 和 ConfigService 時,它總是未定義的。 即使我嘗試實例化new CoreApiService(new HttpService(), new ConfigService())
類的新實例,我什至嘗試過new CoreApiService({} as any, {get: (...params} => {return 'foo'})
在測試本身
它將始終是上述相同的錯誤。
測試文件:
import { Test, TestingModule } from '@nestjs/testing';
import { CoreApiService } from './core-api.service';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { HttpModule } from '@nestjs/common';
class ConfigServiceMock {
get(key: string): string {
switch (key) {
case 'API_SERVICE_ENDPOINT':
return '';
}
}
}
describe('CoreApiService', () => {
let module: TestingModule;
let service: CoreApiService;
beforeEach(async () => {
module = await Test.createTestingModule({
imports: [HttpModule, ConfigModule],
providers: [
CoreApiService,
{ provide: ConfigService, useClass: ConfigServiceMock },
],
}).compile();
service = module.get<CoreApiService>(CoreApiService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});
我什至嘗試過: .overrideProvider(ConfigService).useClass(ConfigServiceMock)
先感謝您!
編輯 03/01
似乎模塊本身的編譯步驟失敗了......所以對於當前的測試文件,日志“COMPILED”將永遠不會被執行。
CoreApiService › should be defined
TypeError: Cannot read property 'get' of undefined
22 |
23 | constructor(private httpService: HttpService, configService: ConfigService) {
> 24 | this.apiEndpoint = configService.get('API_SERVICE_ENDPOINT');
| ^
25 | }
26 |
27 | private static createRequestConfig(options: RequestHeader): RequestConfig {
at new CoreApiService (src/app/core-api/core-api.service.ts:24:38)
at Injector.instantiateClass (../../node_modules/@nestjs/core/injector/injector.js:286:19)
at callback (../../node_modules/@nestjs/core/injector/injector.js:42:41)
at Injector.resolveConstructorParams (../../node_modules/@nestjs/core/injector/injector.js:114:24)
at Injector.loadInstance (../../node_modules/@nestjs/core/injector/injector.js:46:9)
at Injector.loadProvider (../../node_modules/@nestjs/core/injector/injector.js:68:9)
at async Promise.all (index 5)
at InstanceLoader.createInstancesOfProviders (../../node_modules/@nestjs/core/injector/instance-loader.js:43:9)
at ../../node_modules/@nestjs/core/injector/instance-loader.js:28:13
at async Promise.all (index 1)
at InstanceLoader.createInstances (../../node_modules/@nestjs/core/injector/instance-loader.js:27:9)
at InstanceLoader.createInstancesOfDependencies (../../node_modules/@nestjs/core/injector/instance-loader.js:17:9)
at TestingModuleBuilder.compile (../../node_modules/@nestjs/testing/testing-module.builder.js:43:9)
● CoreApiService › should be defined
expect(received).toBeDefined()
Received: undefined
44 | it('should be defined', () => {
45 | console.log('SHOULD BE DEFINED')
> 46 | expect(service).toBeDefined();
| ^
47 | });
48 | });
49 |
at Object.<anonymous> (src/app/core-api/core-api.service.spec.ts:46:21)
當前的測試文件如下所示:
import { Test, TestingModule } from '@nestjs/testing';
import { CoreApiService } from './core-api.service';
import { ConfigService } from '@nestjs/config';
import { HttpService, INestApplication } from '@nestjs/common';
class ConfigServiceMock {
get(key: string): string {
switch (key) {
case 'API_SERVICE_ENDPOINT':
return '';
}
}
}
class HttpServiceMock {
get(): any {
}
}
describe('CoreApiService', () => {
let module: TestingModule;
let service: CoreApiService;
let app: INestApplication;
beforeEach(async () => {
console.log('beforeEach')
module = await Test.createTestingModule({
imports: [],
providers: [
{ provide: ConfigService, useClass: ConfigServiceMock },
{ provide: HttpService, useClass: HttpServiceMock },
CoreApiService,
],
})
.compile();
console.log('COMPILED');
app = module.createNestApplication();
await app.init();
service = module.get<CoreApiService>(CoreApiService);
});
it('should be defined', () => {
console.log('SHOULD BE DEFINED')
expect(service).toBeDefined();
});
});
我也玩過提供者部分的順序,但我想這不相關......
您可能想嘗試兩件事:
beforeEach
中,在模塊中調用compile()
之后,添加以下行:app = module.createNestApplication();
await app.init();
ConfigModule
。 這將初始化實際的配置服務,您不需要它,因為您是 mocking 它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.