本文介绍了测试 Angular 2 父路由的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个访问父路由值的组件,如下所示:
I have a component that accesses a parent route value like this:
ngOnInit() {
this.route.parent.parent.params.subscribe(params => {
this.placeService.getPlace(params['id']).subscribe(place => this.place = place);
});
}
这是完整的文件,以防万一.
Here's the full file in case it helps.
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { PlaceService } from '../place.service';
import { Place } from '../place';
@Component({
selector: 'app-diner-review-list',
templateUrl: './diner-review-list.component.html',
styleUrls: ['./diner-review-list.component.css'],
providers: [PlaceService]
})
export class DinerReviewListComponent implements OnInit {
place: Place;
constructor(private route: ActivatedRoute, private placeService: PlaceService) { }
ngOnInit() {
this.route.parent.parent.params.subscribe(params => {
this.placeService.getPlace(params['id']).subscribe(place => this.place = place);
});
}
}
我的问题是当我运行测试时我得到
My issue is that when I run the test I get
TypeError: 无法读取 null 的属性 'parent'
这是有道理的.this.route.parent
is null
.但我不在乎这些;我现在不测试路线.
This makes sense. this.route.parent
is null
. But I don't care about that; I'm not testing the route right now.
这是我的测试:
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { MockPlaceService } from '../../../testing/mock-place.service';
import { DinerReviewListComponent } from './diner-review-list.component';
import { PlaceService } from '../place.service';
let mockPlaceService = new MockPlaceService();
describe('DinerReviewListComponent', () => {
let component: DinerReviewListComponent;
let fixture: ComponentFixture<DinerReviewListComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
DinerReviewListComponent
],
imports: [RouterTestingModule]
})
.overrideComponent(DinerReviewListComponent, {
set: {
providers: [
{ provide: PlaceService, useValue: mockPlaceService }
]
}
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DinerReviewListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
如何让我的测试忽略不存在的路由值或提供虚假路由值?
推荐答案
我最终以后一种方式解决了这个问题:提供一个假路由.这就是我所做的.
I ended up solving it the latter way: providing a fake route. Here's what I did.
注意提到mockActivatedRoute
的部分.
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { ActivatedRoute } from '@angular/router';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import { MockPlaceService } from '../../../testing/mock-place.service';
import { DinerReviewListComponent } from './diner-review-list.component';
import { PlaceService } from '../place.service';
let mockPlaceService = new MockPlaceService();
class MockActivatedRoute {
parent: any;
params: any;
constructor(options) {
this.parent = options.parent;
this.params = options.params;
}
}
let mockActivatedRoute = new MockActivatedRoute({
parent: new MockActivatedRoute({
parent: new MockActivatedRoute({
params: Observable.of({ id: '1' })
})
})
});
describe('DinerReviewListComponent', () => {
let component: DinerReviewListComponent;
let fixture: ComponentFixture<DinerReviewListComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
DinerReviewListComponent
],
imports: [RouterTestingModule]
})
.overrideComponent(DinerReviewListComponent, {
set: {
providers: [
{ provide: PlaceService, useValue: mockPlaceService },
{ provide: ActivatedRoute, useValue: mockActivatedRoute }
]
}
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DinerReviewListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
这篇关于测试 Angular 2 父路由的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!