Ответ 1
Во - первых, вы должны использовать Subject
вместо Observable
. Наблюдаемый только подписывается один раз. Поэтому он будет излучать только первый набор параметров. С помощью Subject
вы можете продолжать передавать элементы, и одна подписка будет продолжать их получать.
let params: Subject<Params>;
beforeEach(() => {
params = new Subject<Params>();
TestBed.configureTestingModule({
providers: [
{ provide: ActivatedRoute, useValue: { params: params }}
]
})
})
Затем в вашем тесте просто введите новые значения с параметром params.next(newValue)
.
Во-вторых, вам необходимо позвонить tick()
. Так работает fakeAsync
. Вы контролируете асинхронное разрешение задачи. Поскольку наблюдаемый как asychrounous, момент, когда мы отправили событие, он не получит синхронно с подписчиком. Поэтому нам нужно заставить синхронное поведение с tick()
Вот полный тест (Subject
импортируется из 'rxjs/Subject'
)
@Component({
selector: 'test',
template: '
'
})
export class TestComponent implements OnInit {
_pageToShow: string;
constructor(private _route: ActivatedRoute) {
}
ngOnInit() {
this._route.params.forEach((params: Params) => {
if (params['area']) {
this._pageToShow = params['area'];
}
});
}
}
describe('TestComponent', () => {
let fixture: ComponentFixture<TestComponent>;
let component: TestComponent;
let params: Subject<Params>;
beforeEach(() => {
params = new Subject<Params>();
TestBed.configureTestingModule({
declarations: [ TestComponent ],
providers: [
{ provide: ActivatedRoute, useValue: { params: params } }
]
});
fixture = TestBed.createComponent(TestComponent);
component = fixture.componentInstance;
});
it('should change on route param change', fakeAsync(() => {
// this calls ngOnInit and we subscribe
fixture.detectChanges();
params.next({ 'area': 'Terry' });
// tick to make sure the async observable resolves
tick();
expect(component._pageToShow).toBe('Terry');
params.next({ 'area': 'Billy' });
tick();
expect(component._pageToShow).toBe('Billy');
}));
});