¿Existe una forma óptima de definir importaciones, declaraciones, proveedores comunes a todas las especificaciones (es decir, módulos comunes a todas las especificaciones definidos en un lugar como lo hacemos en @NgModule) en un solo lugar como lo hacemos en @NgModule para las pruebas unitarias de aplicaciones?
Nota: Llame a configureTestingModule dentro de beforeEach para que TestBed pueda restablecerse a un estado base antes de que se ejecute cada prueba. como en el documento
Aquí, en una de mis especificaciones de prueba, tengo que cargar los mismos módulos, componentes y directivas, etc., que también utilizan otras especificaciones.
describe('Component: Login', () => { let loginFixture, loginComponent, loginComponentElement,loginComponentDebugElement; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [FormsModule, ReactiveFormsModule, MaterialRootModule, ModalModule, DatepickerModule, DropdownModule, AccordionModule], //--> here we load n number of mudoles declarations: [LoginComponent, LoginHeaderComponent, LoginColumnComponent, LoginColumnContentComponent, LoginStatusLaneComponent, LoginSettingsComponent, LoginLaneComponent, SortableDirective, WindowHeightDirective, ConfirmDirective, ConfirmPopoverComponent, ConfirmationDialogComponent, ConfirmationDialogDirective], //--> here we load n number of components directive and piper providers: [LoginComponent, MockBackend, BaseRequestOptions, ComponentLoaderFactory, ConfirmOptions, { provide: Http, useFactory: (backend, options) => new Http(backend, options), deps: [MockBackend, BaseRequestOptions] }, {provide: AuthService, useClass: MockAuthService}, {provide: AppContextService, useClass: MockAppContextService}, {provide: NotificationsService, useClass: MockNotificationsService}, {provide: PositioningService}] //--> here we load n number of services }).compileComponents(); loginFixture = TestBed.createComponent(LoginComponent); loginComponent = loginFixture.componentInstance; loginComponentElement = LoginFixture.nativeElement; loginComponentDebugElement = LoginFixture.debugElement; })); it('should have a defined component', () => { expect(LoginComponent).toBeDefined(); }); });Nota: Problema de Git Angular TestBed.configureTestingModule Problema de rendimiento
¿Hay algún patrón para que sea común, como cargar todos los componentes de estos módulos, etc., antes de ejecutar todos los archivos spec.ts e inyectar la dependencia respectiva para cada especificación? Cualquier ayuda sería genial.
Mi respuesta es incompleta que has llegado a esperar. Pero espero que si te puede ayudar aunque sea un poco.
router-stubs.ts
//----------Default Import------------ import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; import { HttpModule } from '@angular/http'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; ...snip... export const test_imports = [ BrowserModule, FormsModule, HttpModule, BrowserAnimationsModule ];cada prueba.spec.ts
import { test_imports } from '../testing/router-stubs'; ..snip.. imports: [test_imports],pero los proveedores/declaraciones no pueden usarse de la misma manera.
Debe definir TestBed.configureTestingModule antes del método de descripción. para que pueda estar disponible a nivel mundial. Así que ahora sus casos de prueba se verán así.
TestBed.configureTestingModule({ imports: [FormsModule, ReactiveFormsModule, MaterialRootModule, ModalModule, DatepickerModule, DropdownModule, AccordionModule], //--> here we load n number of mudoles declarations: [LoginComponent, LoginHeaderComponent, LoginColumnComponent, LoginColumnContentComponent, LoginStatusLaneComponent, LoginSettingsComponent, LoginLaneComponent, SortableDirective, WindowHeightDirective, ConfirmDirective, ConfirmPopoverComponent, ConfirmationDialogComponent, ConfirmationDialogDirective], //--> here we load n number of components directive and piper providers: [LoginComponent, MockBackend, BaseRequestOptions, ComponentLoaderFactory, ConfirmOptions, { provide: Http, useFactory: (backend, options) => new Http(backend, options), deps: [MockBackend, BaseRequestOptions] }, {provide: AuthService, useClass: MockAuthService}, {provide: AppContextService, useClass: MockAppContextService}, {provide: NotificationsService, useClass: MockNotificationsService}, {provide: PositioningService}] //--> here we load n number of services }).compileComponents(); describe('Component: Login', () => { let loginFixture, loginComponent, loginComponentElement, loginComponentDebugElement; beforeEach(async(() => { loginFixture = TestBed.createComponent(LoginComponent); loginComponent = loginFixture.componentInstance; loginComponentElement = LoginFixture.nativeElement; loginComponentDebugElement = LoginFixture.debugElement; })); it('should have a defined component', () => { expect(LoginComponent).toBeDefined(); }); });No hay necesidad de buscar una biblioteca separada solo para lograr esto. Puede crear un TestBed global simplemente creando un módulo angular común donde puede definir un método de utilidad. Este método de utilidad crea TestBed que luego puede reutilizar en todos sus archivos de especificaciones.
Puede consultar la respuesta a continuación, que también incluye código de muestra: (Posible duplicado) https://stackoverflow.com/a/64835814/4184651