Angular2 rc3 внедряет роутер в тесты

Поскольку я обновился до Angular2 rc3, все тесты, требующие внедрения Router, теперь терпят неудачу. Раньше я использовал ROUTER_FAKE_PROVIDERS, доступный из файла маршрутизатора/тестирования, но, похоже, его больше не существует. Какие-либо предложения?


person HomeBrew    schedule 29.06.2016    source источник
comment
ты решил проблему?   -  person Kamran Pervaiz    schedule 09.08.2016


Ответы (2)


Я использовал эту настройку, которая работала для инициализации маршрутизатора. https://github.com/angular/angular/blob/master/modules/%40angular/router/test/router.spec.ts

Ожидайте, что Angular2 скоро предоставит это как TestProvider.

import {Location, LocationStrategy} from '@angular/common';
import {SpyLocation} from '@angular/common/testing';
import {MockLocationStrategy} from '@angular/common/testing/mock_location_strategy';
import {Component, Injector, ComponentResolver} from '@angular/core';
import {ActivatedRoute, ActivatedRouteSnapshot, CanActivate, CanDeactivate, DefaultUrlSerializer, Event, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Params, ROUTER_DIRECTIVES,  Router, RouterConfig, RouterOutletMap, RouterStateSnapshot, RoutesRecognized, UrlSerializer} from '@angular/router';


export function provideTestRouter(RootCmp:any, config: RouterConfig):any[]{      
    return [
      RouterOutletMap,
      {provide: UrlSerializer, useClass: DefaultUrlSerializer},
      {provide: Location, useClass: SpyLocation},
      {provide: LocationStrategy, useClass: MockLocationStrategy},
      {
        provide: Router,
        useFactory: (resolver: ComponentResolver, urlSerializer: UrlSerializer, outletMap: RouterOutletMap, location: Location, injector: Injector) => {
          return new (<any>Router)(
          RootCmp, resolver, urlSerializer, outletMap, location, injector, config);
        },
        deps: [ComponentResolver, UrlSerializer, RouterOutletMap, Location, Injector]
      },
      {provide: ActivatedRoute, useFactory: (r: Router) => r.routerState.root, deps: [Router]},
    ];
};
person Dennis Neuendorf    schedule 01.07.2016

Взгляните на мой ответ здесь, похоже, у вас похожая проблема.

При модульном тестировании иногда определенная служба вызывает проблемы только потому, что она не используется в обычной среде. Вы можете проверить, был ли он вызван, не запуская модульный тест для всей службы. Сделайте это, создав фиктивный класс.

Основываясь на этом сообщении, вот что вы можете сделать:

describe('foo', () => {

class MockRouter{}

beforeEachProviders(() => [
  {provide: ROUTER_PROVIDERS, useClass: MockRouter}
]);

it('should foo',
  async(inject([FooComponent, ROUTER_PROVIDERS], (foo: FooComponent, mockRouter: MockRouter) => {
  expect(mockRouter).toHaveBeenCalled();
  });
})));
person jhhoff02    schedule 29.06.2016
comment
Спасибо, чувак, я пробовал это, но мне нужен настоящий маршрутизатор для зависимостей, которые у меня есть в моем коде. Я мог бы высмеять все это, но это было бы довольно избыточно. - person HomeBrew; 29.06.2016
comment
Нет проблем, я вижу. От чего зависит ваш код от маршрутизатора? - person jhhoff02; 29.06.2016