Angular 角度测试存根和打字脚本

Angular 角度测试存根和打字脚本,angular,typescript,Angular,Typescript,我一直在关注angular并设置了一个测试,如下所示 let component: MyComponent; let fixture: ComponentFixture<MyComponent>; let activatedRoute: ActivatedRouteStub; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [MyComponent],

我一直在关注angular并设置了一个测试,如下所示

let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
let activatedRoute: ActivatedRouteStub;

beforeEach(async(() => {
    TestBed.configureTestingModule({
        declarations: [MyComponent],
        providers: [
            {provide: ActivatedRoute, useClass: ActivatedRouteStub},
            {provide: Router, useClass: RouterStub}
        ]
    });
}));

beforeEach(() => {
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    activatedRoute = fixture.debugElement.injector.get(ActivatedRoute);
    activatedRoute.testParams = { email: email};
    fixture.detectChanges(); // calls ngOnInit
});
在我执行
npm安装来更新软件包(Angular 4和typescript)之前,这一切都进行得很顺利,现在我遇到了以下错误

TS2322: Type 'ActivatedRoute' is not assignable to type 'ActivatedRouteStub'.
  Property 'subject' is missing in type 'ActivatedRoute'.

TS2339: Property 'parent' does not exist on type 'ActivatedRouteStub'.

你知道我为什么会突然出现这些错误吗?

问题是它试图检索一个
ActivatedRoute
类,并分配到
ActivatedRouteStub
。解决方法如下:

let activatedRoute: ActivatedRouteStub;
 ...
activatedRoute = fixture.debugElement.injector.get(ActivatedRoute) as any;

我无法解释发生了什么变化(这可能取决于Angular和Typescript的早期版本)。但这些错误似乎很容易修复:a)将存根类的
subject
属性设置为公共变量,b)将
parent
属性添加到存根类中。然而,我一直在摸索编写测试的更好方法,您可能会考虑摆脱stubbed类,并使用
RouterTestingModule
。只是一个猜测,以防它使您的测试更容易…如果您将:
imports:[RouterTestingModule],
添加到测试床配置中,而不是声明
Router
ActivatedRoute
的各个提供程序,则可能会减少对存根的需求。“拿这句话来说吧,我仍然在用Angular2/Angular4进行测试。”SunilD。
RouterTestingModule
中没有
ActivatedRoute
存根。不幸的是,您仍然被迫手动模拟。请参阅
ActivatedRouteStub
ActivatedRoute
的接口不匹配。所以它不是一个完整的存根。
let activatedRoute: ActivatedRouteStub;
 ...
activatedRoute = fixture.debugElement.injector.get(ActivatedRoute) as any;