Angular 带反向导航的角度测试路由

Angular 带反向导航的角度测试路由,angular,testing,location,router,back,Angular,Testing,Location,Router,Back,我正在尝试在角度应用程序中测试路由。我可以成功测试前向导航,但无法测试后向导航 我的测试规范: 从“@angular/common”导入{Location}; 从“@angular/core/testing”导入{TestBed,fakeAsync,tick}; 从“@angular/router/testing”导入{RouterTestingModule}”; 从“@angular/Router”导入{Router}”; 进口{ HomeComponent, 搜索组件, 应用组件, 路线 }

我正在尝试在角度应用程序中测试路由。我可以成功测试前向导航,但无法测试后向导航

我的测试规范:

从“@angular/common”导入{Location};
从“@angular/core/testing”导入{TestBed,fakeAsync,tick};
从“@angular/router/testing”导入{RouterTestingModule}”;
从“@angular/Router”导入{Router}”;
进口{
HomeComponent,
搜索组件,
应用组件,
路线
}从“/路由器”
描述('路由器:应用',()=>{
让位置:位置;
让路由器:路由器;
让夹具;
在每个之前(()=>{
TestBed.configureTestingModule({
导入:[RouterTestingModule.withRoutes(路由)],
声明:[
HomeComponent,
搜索组件,
应用组件
]
});
路由器=测试台.get(路由器);
location=TestBed.get(位置);
fixture=TestBed.createComponent(AppComponent);
});
它('location.back()',fakeAsync(()=>{
路由器。导航(['']);
勾选();
expect(router.routerState.snapshot.url).toBe('/home');
router.navigate(['/search']);
勾选();
expect(router.routerState.snapshot.url).toBe('/search');
console.log('BACK')
location.back()
勾选();
expect(location.path()).toBe('/home');
expect(router.routerState.snapshot.url).toBe('/home');
})); 
});
使用
router.navigate()
时,
routerState
会更新(我还检查了
router.events
是否发送导航事件)。但是,当调用
location.back()
时,路由器状态没有更新,我通过
router.events
没有收到任何路由器事件

测试代码的首选方法是什么,它在角度上使用向后(和向前)导航


提前谢谢。

我也有同样的问题,也没有任何线索。因此,我开始深入研究
RouterTestingModule
如何在您的用例中设置两个最重要的“组件”:
Router
Location

使用的路由器是真实的,但它是交给
SpyLocation
。所以我认为它只是伪造了popstate,并没有以任何方式修改路由器状态,但它实际上有着与真实位置相同的副作用——它会发出一个事件(在您的例子中是popstate)。现在,
Router
不管位置实现如何,通过调用其
setUpLocationChangeListener
订阅这些事件,当一个事件发生时,如popstate,它会在其
routerState
中反映出来。我发现,在我的测试用例中,显然在你的测试用例中,没有创建事件订阅,因为没有调用这个方法

解决办法很简单。在测试任何popstate代码之前,必须调用
router.initialNavigation()
。理想情况下,您可以将其作为路由器上的第一个操作。因为,正如您在下面看到的(这是唯一一个完成此操作的地方),位置更改侦听器设置在那里


找到解决办法了吗?找到了@CularBytes
initialNavigation(): void {
    this.setUpLocationChangeListener();                                                                                                                                                                                                                                            
    if (this.navigationId === 0) {
        this.navigateByUrl(this.location.path(true), {replaceUrl: true})      
    }
}