Creé una aplicación Angular menor a 4. Migré de una versión a otra y actualmente soy la última versión 9. Estaba revisando mis pruebas. Tengo un componente de inicio de sesión en el que tuve 3 pruebas de trabajo y ahora todas fallan. Ahora está devolviendo lo siguiente:
LoginComponent should be created ... Failed: unreachable Error: unreachable at injectableDefOrInjectorDefFactory (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:17302:1) at providerToFactory (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:17402:1) at providerToRecord (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:17349:1) at R3Injector.processProvider (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:17165:1) at http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:17144:1 at http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:1400:1 at Array.forEach (<anonymous>) at deepForEach (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:1400:1) at R3Injector.processInjectorType (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:17140:1) at http://localhost:9876/_karma_webpack_/node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:16881:1La prueba de jazmín es la siguiente:
// File: login.component.spec.ts import { async, ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule, NgForm } from '@angular/forms'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { of, throwError } from 'rxjs'; import { SelectItem } from 'primeng/api'; import { Dialog } from 'primeng/dialog'; import { Header, Footer } from 'primeng/api'; import { ButtonModule } from 'primeng/button'; // import { AlertsService } from '../../global/alerts/alerts.service'; import { UserService } from '../../net-incident/services/user.service'; import { AuthService } from '../../net-incident/services/auth.service'; import { LoginComponent } from './login.component'; import { ServerSelectionWindowComponent } from '../../net-incident/server-selection-window/server-selection-window.component'; // describe('LoginComponent', () => { let sut: LoginComponent; let fixture: ComponentFixture<LoginComponent>; let alertService: AlertsService; const authServiceSpy = jasmine.createSpyObj('AuthService', ['authenticate', 'logout', 'isLoggedIn', 'isLoggedOut']); const userServiceSpy = jasmine.createSpyObj('UserService', ['emptyUser', 'getUser', 'getUserServer']); // beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ FormsModule, ButtonModule, BrowserAnimationsModule ], declarations: [ LoginComponent, Dialog, Header, Footer, ServerSelectionWindowComponent ], providers: [ { provide: AlertsService, useClass: AlertsService }, { provide: AuthService, useValue: authServiceSpy }, { provide: UserService, useClass: userServiceSpy } ] } ); alertService = TestBed.get( AlertsService ); TestBed.compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(LoginComponent); sut = fixture.componentInstance; fixture.detectChanges(); }); it('should be created ...', () => { expect( sut ).toBeTruthy(); }); });providers: [ ... { provide: UserService, useClass: userServiceSpy } ]Debería cambiarse a:
providers: [ ... { provide: UserService, useValue: userServiceSpy } ]También puede crear una clase simulada para usarla como su UserService:
class MockUserService { myMethod(): void { // mocked logic } } describe('LoginComponent', () => { ... providers: [ ... { provide: UserService, useClass: MockUserService } ] ... });Para mí, cambié useClass por useValue. Como el siguiente ejemplo:
TestBed.configureTestingModule({ declarations: [...], imports: [...], providers: [ { provide: PlansService, useClass: mockPlansService }, { provide: AuthService, useClass: mockOAuthService } ] }).compileComponents();Para esto
TestBed.configureTestingModule({ declarations: [...], imports: [...], providers: [ { provide: PlansService, useValue: mockPlansService }, { provide: AuthService, useValue: mockOAuthService } ] }).compileComponents();