angular 2.0.0-rc.1 + karma:提供路由器

时间:2016-05-07 14:19:56

标签: angular angular2-routing

当测试需要Router的实例时,仅提供Router本身是不够的:

import {Router} from '@angular/router';

import {it, inject, beforeEachProviders} from '@angular/core/testing';
import {ComponentToTest} from './component.to.test';

describe('ComponentToTest', () => {
  beforeEachProviders(() => [
    Router,    
    ComponentToTest
  ]);


  it('should call getData() on contruct', inject([Router], (router) => {
    spyOn(ComponentToTest.prototype, 'getData');
    expect(ComponentToTest.prototype.getData).not.toHaveBeenCalled();
    let component = new ComponentToTest(router);
    expect(ComponentToTest.prototype.getData).toHaveBeenCalled();
  }));
});

将发生以下错误:

  

错误:无法解析'Router'的所有参数(?,?,?,?,?,?)。确保所有参数都使用Inject进行修饰或具有有效的类型注释,并且“Router”使用Injectable进行修饰。

但我真的不知道如何解决路由器。

Router参数

_rootComponent:Object,

_rootComponentType:Type,

在alpha中我们有RootRouterimport {RootRouter} from 'angular2/src/router/router';。现在已经没有任何替代品了。

_componentResolver:ComponentResolver,

_urlSerializer:RouterUrlSerializer,

还没有弄清楚如何提供这些。

_routerOutletMap:RouterOutletMap,

似乎这已经在路由器本身提供了

_location:Location

此参数可能仍由SpyLocation提供:

import {SpyLocation} from '@angular/common/testing';

describe('ComponentToTest', () => {
  beforeEachProviders(() => [
    provide(Location, { useClass: SpyLocation }),
  ]);
});

2 个答案:

答案 0 :(得分:6)

导入@angular/router/testing并在ROUTER_FAKE_PROVIDERS

中提供beforeEachProviders()
beforeEachProviders(() => [
  ROUTER_FAKE_PROVIDERS,
  ComponentToTest
]);

答案 1 :(得分:0)

另一种解决方案是使用import {RouterTestingModule} from '@angular/router/testing';并将RouterTestingModule添加到测试文件中的导入中。

beforeEach(() => {
  TestBed.configureTestingModule({
    declarations: [
      AppComponent
    ],
    imports: [
      RouterTestingModule
    ]
  });
  TestBed.compileComponents();
});