前面的例子public events = Observable.of( new NavigationEnd(0, 'http://localhost..')); 根据 Karma 似乎不起作用,抱怨:
失败:未定义不是一个对象(评估
'router.routerState.root')
rootRoute@http://localhost:9876/_karma_webpack_/vendor.bundle.js
尽管(模拟)路由器实例events的订阅回调已在原始app.component.ts的ngOninit()成功运行,即Karma正在测试的主要应用程序组件:
this.sub = this.router.events.subscribe(e => { // successful execution across Karma
事实上,从 Karma 的角度来看,Router 被模拟的方式看起来有点不完整,作为一个 结构 是不准确的:因为 router.routerState 在运行时是未定义的。
以下是 Angular 路由器在我这边被“存根”的方式,包括 RoutesRecognized events 人工烘焙 在我的例子中是 Observables:
class MockRouter {
public events = Observable.of(new RoutesRecognized(2 , '/', '/',
createRouterStateSnapshot()));
}
const createRouterStateSnapshot = function () {
const routerStateSnapshot = jasmine.createSpyObj('RouterStateSnapshot',
['toString', 'root']);
routerStateSnapshot.root = jasmine.createSpyObj('root', ['firstChild']);
routerStateSnapshot.root.firstChild.data = {
xxx: false
};
return <RouterStateSnapshot>routerStateSnapshot;
};
为了符合ngOnInit() body 的期望,需要RoutesRecognized 事件 具有深层结构:
ngOnInit() {
this.router.events.filter((event) => {
return event instanceof RoutesRecognized;
}).subscribe((event: RoutesRecognized) => {
// if (!event.state.root.firstChild.data.xxx) {
// RoutesRecognized event... to be baked from specs mocking strategy
});
}
我的 内容的回顾/总结:
角度/路由器:5.2.9,
业力:2.0.2,
茉莉花核:2.6.4,
业力茉莉花:1.1.2