Ошибка 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

Другие вопросы по тегам