typescript - angular 5 testning - konfigurera testbed globalt
Jag vill importera vissa moduler för alla testsviter såsom ngrx Store, ngx translate eller httpClientModule i ett [email -projekt med Angular 5.
i den genererade test.ts har jag lagt till en test.configureTestingModule
const testBed: TestBed = getTestBed();
testBed.initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
testBed.configureTestingModule({
imports: [
HttpClientModule,
StoreModule.forRoot(reducers, { metaReducers }),
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
}
}),
]
}
Fortfarande i en user.service.spec.ts står det ingen leverantör för Store.
user.service.spec.ts
describe('UserService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [UserService]
});
});
it('should be created', inject([UserService], (service: UserService) => {
expect(service).toBeTruthy();
}));
});
Överskrider Test.configureTestingModule i user.service.spec den som finns i test.ts?
Om så är fallet, hur kan jag konfigurera TestBed på en global nivå för att undvika att importera repetitiva moduler?
Tack!
Svar #1
Det korta svaret är att TestBed kopplar in sig i Jasmines beforeEach och afterEach-återanrop som återställer testmodulen mellan VARJE test. Detta ger dig ett rent ark för varje enhetstest.
Detta betyder att du inte kan använda TestBed.configureTestingModule inuti din test.ts-fil. Du måste göra det för varje spec manuellt eller skriva dina egna standardtestinställningsverktyg för att hantera det.
Jag är utvecklaren för shallow-render som faktiskt har en lösning för detta genom att använda Shallow.alwaysProvide() för att globalt konfigurera/överskriva/mocka providers och forRoot-providers i din testmiljö. Resten av din testmodulsetup hanteras av biblioteket.
https://github.com/getsaf/shallow-render#global-providers-with-alwaysprovide
Hoppas det här hjälper.
Svar #2
Det andra svaret täcker hur configureTestingModule fungerar före/efter enskilda tester, men du behöver inte nödvändigtvis använda ett plugin för att ha en enkel "alltid tillhandahålla" moduluppsättning. Jag skapade en paths-alias i min test-tsconfig:
"paths": {
"@testing": ["src/testing/index"],
"@testing/*": ["src/testing/*"]
}
Detta låter mig skriva en TestModule-modul med alla delade importer:
@NgModule({
imports: [
// All repeated modules
],
})
export class TestModule { }
Då behöver varje anrop till configureTestingModule endast import { TestCommon } "@testing/test-common.module" och inkludera det i imports-sektionen i testmodulens konfiguration.
