Ошибка Angular 2 / Jasmine / Karma: Ошибка: невозможно разрешить все параметры для маршрутизатора: (?,?,?,?,?,?,?,?). в config/karma-shim.js
Вот услуга:
import { Injectable } from '@angular/core';
import { Router, Event, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router';
@Injectable()
export class LoaderService {
public shouldShowLoader: boolean = false;
constructor(private router: Router) {
router.events.subscribe((event: Event) => {
this.navigationInterceptor(event);
});
}
// Shows and hides the loading spinner during Event changes
navigationInterceptor(event: Event): void {
if (event instanceof NavigationStart) {
this.shouldShowLoader = true;
}
else if (event instanceof NavigationEnd) {
this.shouldShowLoader = false;
}
// Set loading state to false in both of the below events to hide the spinner in case a request fails
else if (event instanceof NavigationCancel) {
this.shouldShowLoader = false;
}
else if (event instanceof NavigationError) {
this.shouldShowLoader = false;
}
else {
this.shouldShowLoader = false;
}
}
}
Вот тест, который не проходит:
import { TestBed, inject } from '@angular/core/testing';
import { Router } from '@angular/router';
import { LoaderService } from './loader.service';
describe('LoaderServiceTest', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [ LoaderService, Router ]
});
});
it('#LoaderService should be defined', inject([LoaderService, Router], (service: LoaderService) => {
expect(service).toBeDefined();
}));
});
Не уверен, почему это не удается? В поисках похожих проблем я могу найти ответы только на бета-версию Angular 2... мы используем последнюю версию Angular 2 / 2.2.0
1 ответ
Ваш тест не пройден, потому что вы не предоставили в модуль тестирования все параметры, для которых требуется создать маршрутизатор. Сказав это, в модульном тестировании не рекомендуется использовать фактическую реализацию сервиса, такого как Маршрутизатор. Лучшей альтернативой было бы сделать такую заглушку (я добавил шпиона для функции внутри маршрутизатора, чтобы продемонстрировать, как это будет сделано, если вы захотите проверить, что функция была вызвана в какой-то момент):
class RouterStub {
navigateByUrl = jasmine.createSpy('navigateByUrl');
}
затем при настройке модуля тестирования:
providers: [
...,
{ provide: Router, useClass: RouterStub }
]
Если вам нужна дополнительная информация о том, как использовать макеты и настройку модульного тестирования, ее можно найти в официальных документах здесь: https://angular.io/docs/ts/latest/guide/testing.html