Я пишу юнит-тест для приложения Angular, которое удаляет учетную запись из базы данных. Для этого я нажимаю кнопку удаления. Затем вызывается функция для файла .ts. Это приведет к удалению учетной записи путем вызова API.
Я хочу написать модульный тест, чтобы увидеть, вызывается ли этот API-интерфейс с использованием HttpTestingModule, но в коде после удаления учетной записи я перехожу на другую страницу. используя router.navigate. Когда код попадает, он жалуется. ПРЕДУПРЕЖДЕНИЕ: «Навигация сработала за пределами угловой зоны, вы забыли вызвать« ngZone.run () »?»
ERROR: 'Unhandled Promise rejection:', 'Cannot match any routes. URL Segment: 'accountsList'', '; Zone:', 'ProxyZone', '; Task:', 'Promise.then', '; Value:', Error: Cannot match any routes. URL Segment: 'accountsList'
Error: Cannot match any routes. URL Segment: 'accountsList'
at ApplyRedirects.noMatchError (./node_modules/@angular/router/fesm5/router.js?:1455:16)
at CatchSubscriber.eval [as selector] (./node_modules/@angular/router/fesm5/router.js?:1436:29)
at CatchSubscriber.error (./node_modules/rxjs/_esm5/internal/operators/catchError.js?:40:31)
at MapSubscriber.Subscriber._error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:89:26)
at MapSubscriber.Subscriber.error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:69:18)
at MapSubscriber.Subscriber._error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:89:26)
at MapSubscriber.Subscriber.error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:69:18)
at MapSubscriber.Subscriber._error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:89:26)
at MapSubscriber.Subscriber.error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:69:18)
at ThrowIfEmptySubscriber.Subscriber._error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:89:26), 'Error: Cannot match any routes. URL Segment: 'accountsList'
at ApplyRedirects.noMatchError (./node_modules/@angular/router/fesm5/router.js?:1455:16)
at CatchSubscriber.eval [as selector] (./node_modules/@angular/router/fesm5/router.js?:1436:29)
at CatchSubscriber.error (./node_modules/rxjs/_esm5/internal/operators/catchError.js?:40:31)
at MapSubscriber.Subscriber._error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:89:26)
at MapSubscriber.Subscriber.error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:69:18)
at MapSubscriber.Subscriber._error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:89:26)
at MapSubscriber.Subscriber.error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:69:18)
at MapSubscriber.Subscriber._error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:89:26)
at MapSubscriber.Subscriber.error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:69:18)
at ThrowIfEmptySubscriber.Subscriber._error (./node_modules/rxjs/_esm5/internal/Subscriber.js?:89:26)'
, вот что я пытался
test.spec.ts
it ('should delete account, if account exist', ()=> {
let spyOnDelete = spyOn (component,'deleteRecord').and.callThrough();
fixture.detectChanges();
component.record.accountid = "Account1";
fixture.detectChanges();
let deleteButtonDOM = fixture.debugElement.query(By.css('#deletebtn'));
console.log(deleteButtonDOM.nativeElement);
deleteButtonDOM.triggerEventHandler('click',null);
fixture.detectChanges();
expect(spyOnDelete).toHaveBeenCalled(); //test passes
const req = _HttpTestingController.expectOne('/api/accounts/'+component.record.accountid);//test fails
expect(req.request.method).toBe("DELETE");
req.flush({status:"SUCCESS"});
expect(component.consoleMessages.includes("POST: SUCCESS in /api/accounts")).toBe(true);
..what must be written to
})
test.component.ts
deleteRecord(id) {
this.spinner.show();
this.http.delete('/api/accounts/' + id)
.subscribe(res => {
this.spinner.hide();
if (res['status'] == "FAILURE") {
this.consoleMessages += "\nPOST: ERROR in /api/accounts\n" + JSON.stringify(res);
} else {
this.consoleMessages += "\nPOST: SUCCESS in /api/accounts\n" + JSON.stringify(res);
this.router.navigate(['/accountsList']);//this is creating the problem xxxxxxxxxxxxxxxx
}
}, (err) => {
this.consoleMessages += "\nPOST: ERROR in /api/accounts\n" + JSON.stringify(err);
this.spinner.hide();
console.log(err);
}
);
}