unit tutorial test run karma javascript angular unit-testing

javascript - tutorial - unit test angular 5



Angular 4 Unit test error: no se pudo ejecutar ''enviar'' en ''XMLHttpRequest'': no se pudo cargar ''ng:///DynamicTestModule/LoginComponent.ngfactory.js'' (4)

Estoy escribiendo algunas pruebas unitarias para mi componente y recibo este mensaje de error críptico. Encontré una pregunta similar en la prueba de unidad Angular 2: error al cargar ''ng: ///DynamicTestModule/module.ngfactory.js'' pero las respuestas no me ayudaron a resolver mi problema. Soy angular 4.3.2

Aquí está el componente para el que estoy escribiendo la prueba:

import {Component} from ''@angular/core''; import {Router} from ''@angular/router''; import {NotificationService} from ''../common/notification/notification.service''; import {SessionService} from ''../common/session/session.service''; import {Login} from ''./login.model''; @Component({ selector: ''cc-login-form'', templateUrl: ''./login.component.html'', styleUrls: [''./login.component.scss''], }) export class LoginComponent { model: Login = new Login('''', ''''); constructor(private sessionService: SessionService, private router: Router, private notificationService: NotificationService) { } onSubmit() { this.sessionService .login(this.model.email, this.model.password) .subscribe( sessionInfo => { this.notificationService.showSuccess(''notification.successfully.logged.in''); this.router.navigate([`/cc/list`]); }, error => this.notificationService.showError(''notification.invalid.login'') ); } }

Y aquí está el archivo de prueba:

import {async, ComponentFixture, TestBed} from ''@angular/core/testing''; import {FormsModule} from ''@angular/forms''; import {Router} from ''@angular/router''; import {TranslateModule, TranslateService} from ''@ngx-translate/core''; import {NotificationService} from ''../common/notification/notification.service''; import {NotificationServiceStub} from ''../common/notification/tests/NotificationServiceStub''; import {SessionService} from ''../common/session/session.service''; import {SessionServiceStub} from ''../common/session/tests/SessionServiceStub''; import {RouterStub} from ''../common/tests/RouterStub''; import {TranslateServiceStub} from ''../common/translate/tests/TranslateServiceStub''; import {LoginComponent} from ''./login.component''; describe(''LoginComponent'', () => { let component: LoginComponent; let fixture: ComponentFixture<LoginComponent>; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ FormsModule, TranslateModule ], declarations: [LoginComponent], providers: [ {provide: SessionService, useClass: SessionServiceStub}, {provide: Router, useClass: RouterStub}, {provide: NotificationService, useClass: NotificationServiceStub}, {provide: TranslateService, useClass: TranslateServiceStub}, ] }) .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(LoginComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it(''should be created'', () => { expect(component).toBeTruthy(); }); });

Al ejecutar la prueba obtengo lo siguiente en la consola de Chrome:

zone.js:2642 XMLHttpRequest cannot load ng:///DynamicTestModule/LoginComponent.ngfactory.js. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. (anonymous) @ zone.js:2642 zone.js:195 Uncaught DOMException: Failed to execute ''send'' on ''XMLHttpRequest'': Failed to load ''ng:///DynamicTestModule/LoginComponent.ngfactory.js''. at http://localhost:9876/_karma_webpack_/webpack:/Users/pedrompg/Documents/quandoo/fe/chains-center/~/zone.js/dist/zone.js:2642:1 at XMLHttpRequest.proto.(anonymous function) [as send] (

Cualquiera me puede ayudar con eso?

EDITAR - 1 Aquí está la implementación de servicios / stubs

SessionServiceStub

export class SessionServiceStub implements ISessionService { login(login: string, password: string): Observable<any> { return Observable.of({merchantId: 123}); } logout(): Observable<any> { throw new Error(''Method not implemented.''); } validateSessionToken(): Observable<any> { throw new Error(''Method not implemented.''); } }

Servicio de sesion

@Injectable() export class SessionService implements ISessionService { constructor(private http: CcHttpClient, private router: Router, private localSessionService: LocalSessionService) { } login(login: string, password: string): Observable<any> { return this.http.post(`api/sessions`, {login: login, password: password}).map((res: Object) => { this.localSessionService.createSession(res); return res; }); } }

RouterStub

export class RouterStub { navigate(commands: any[], extras?: NavigationExtras): Promise<boolean> { return Promise.resolve(true); }; }

TranslationServiceStub

export class TranslateServiceStub { instant(key: string | Array<string>, interpolateParams?: Object): string | any { return ''translation''; }; }

NotificationServiceStub

export class NotificationServiceStub implements INotificationService { showToast(type, text, title, defaultTitle): Promise<Toast> { return Promise.resolve(null); } showSuccess(msg, title?): Promise<Toast> { return Promise.resolve(null); } showError(msg, title?): Promise<Toast> { return Promise.resolve(null); } }

EDITAR 2 Al cambiar mi configuración de TestBed a lo siguiente se eliminó el error pero se introdujo uno nuevo:

beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ FormsModule, HttpClientModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, useFactory: HttpTranslateLoaderFactory, deps: [HttpClient] } }) ], declarations: [LoginComponent], providers: [ {provide: SessionService, useClass: SessionServiceStub}, {provide: Router, useClass: RouterStub}, {provide: NotificationService, useClass: NotificationServiceStub}, ] }) .compileComponents(); }));

Ahora el mensaje de error es

TypeError: Cannot read property ''assertPresent'' of undefined at resetFakeAsyncZone home/pedrompg/Documents/quandoo/fe/chains-center/~/@angular/core/@angular/core/testing.es5.js:304:1) at Object.<anonymous> home/pedrompg/Documents/quandoo/fe/chains-center/~/@angular/core/@angular/core/testing.es5.js:1001:1) at ZoneQueueRunner.webpackJsonp.../../../../zone.js/dist/jasmine-patch.js.jasmine.QueueRunner.ZoneQueueRunner.execute home/pedrompg/Documents/quandoo/fe/chains-center/~/zone.js/dist/jasmine-patch.js:132:1)

Lo que sucede en esta función:

function resetFakeAsyncZone() { _fakeAsyncTestZoneSpec = null; ProxyZoneSpec.assertPresent().resetDelegate(); //ProxyZoneSpec is undefined here for whatever reason }


Acabo de encontrarme con este error y el problema fue mi burla. En el component.ngOnInit usé this.route.paramMap.subscribe (...) donde route es una instancia de ActivatedRoute

En mi prueba proporcioné un servicio simulado como este:

providers: [ { provide: ActivatedRoute, useValue: { snapshot: { params: { id: 1 } } } } ]

Y de hecho me perdí de burlarme del método paramMap

Entonces lo arreglo agregando un paramMap propiedades como esta

providers: [ { provide: ActivatedRoute, useValue: { snapshot: { params: { id: 1 } }, paramMap: Observable.of({get: () => 1}) } } ]

Entonces no tengo más este error estúpido.

Entonces, para usted, espero que la clase SessionServiceStub esté incompleta o sea errónea. ¿Obtiene un método de inicio de sesión que devuelve un observable?

Si no es el problema, puedes revisar el NotificationServiceStub

Debes usar un depurador (con Webstorm es fácil de depurar paso a paso) para ayudarte.


Encontré el mismo problema usando angular-cli 6, así que para obtener el mensaje de error correcto, se debe usar lo siguiente:

ng test --source-map=false

Tal vez ayude a alguien :).


Este es un problema con la versión 1.2.2 de Angular Cli o más reciente . Ejecute su prueba con --sourcemaps=false y obtendrá los mensajes de error correctos.

ng test --sourcemaps = false

EDITAR

taquigrafía para esto es:

ng prueba -sm = falso

Vea los detalles aquí: https://github.com/angular/angular-cli/issues/7296


He estado persiguiendo esto por horas. Finalmente descubrí que el problema era simplemente que había importado HttpClientModule, pero no HttpClient :

import { HttpClient, HttpClientModule } from ''@angular/common/http'';

Todos esos errores CORS, y ''[Script Loader]'', DOMException{stack: ''Error: Failed to execute ''send'' on ''XMLHttpRequest'' , ¡y se redujo a simplemente no tener HttpClient!