将模拟路由器用于测试台时出现未定义错误
Root undefined error when using mock router for test bed
从 6->7 升级了 angular/primeng 包,现在一些单元测试失败了。当我尝试为测试台提供我自己的模拟路由器时,我不断收到 "cannot read property 'root' of undefined"。
我注意到 Testbed 正在导入 RouterTestingModule 并提供模拟,所以我删除了导入但仍然看到问题。使用相同的包锁降级解决了这个问题,但是我需要升级并且不确定如何测试 ngOnInit 而无法在模拟中设置路由器 url/events..
我正在尝试测试以下内容:
ngOnInit() {
this.router.events
.pipe(takeUntil(this.onDestroy))
.pipe(filter(e => e instanceof NavigationEnd))
.subscribe((event) => {
this.title.setTitle(this.generateTabTitle(this.router.url));
});
原测试文件:
let mockRouterService = {
url: 'test/testSite',
events: new Observable(observer => {
observer.next(new NavigationEnd(0, 'http://mocksite.com/test',
'http://mocksite.com/test'));
observer.complete();
})
};
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
AppModule,
RouterTestingModule
],
providers: [
{ provide: APP_BASE_HREF, useValue: '/' },
{ provide: Router, useValue: mockRouterService},
{ provide: Title, useClass: Title},
]
}).compileComponents();
fixture = TestBed.createComponent(AppComponent);
component = fixture.debugElement.componentInstance;
fixture.detectChanges();
mockRouterService = TestBed.get(Router);
mockTitleService = TestBed.get(Title);
}));
it('should set the title from the first router event', async(() => {
expect(mockRouterService.events).toBeTruthy();
expect(mockTitleService.getTitle()).toBe(`Test - Title);
}));
我无法为 testbed.router spyOnProperty,因为它是只读的。是否有任何其他方法可以测试 ngOnInit,因为我无法提供预先设置 event/url 的模拟路由器?
编辑修复:添加 routerState: {} 到我的 mockRouterService 并且测试台现在再次接受这个路由器 prvoider。
在您的情况下,最好使用 RouterTestingModule
而不是路由器模拟。问题的根源是您的模拟缺少组件使用的某些功能。这个 SO 包含 RouterTestingModule
用法的一个很好的例子。
从 6->7 升级了 angular/primeng 包,现在一些单元测试失败了。当我尝试为测试台提供我自己的模拟路由器时,我不断收到 "cannot read property 'root' of undefined"。
我注意到 Testbed 正在导入 RouterTestingModule 并提供模拟,所以我删除了导入但仍然看到问题。使用相同的包锁降级解决了这个问题,但是我需要升级并且不确定如何测试 ngOnInit 而无法在模拟中设置路由器 url/events..
我正在尝试测试以下内容:
ngOnInit() {
this.router.events
.pipe(takeUntil(this.onDestroy))
.pipe(filter(e => e instanceof NavigationEnd))
.subscribe((event) => {
this.title.setTitle(this.generateTabTitle(this.router.url));
});
原测试文件:
let mockRouterService = {
url: 'test/testSite',
events: new Observable(observer => {
observer.next(new NavigationEnd(0, 'http://mocksite.com/test',
'http://mocksite.com/test'));
observer.complete();
})
};
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
AppModule,
RouterTestingModule
],
providers: [
{ provide: APP_BASE_HREF, useValue: '/' },
{ provide: Router, useValue: mockRouterService},
{ provide: Title, useClass: Title},
]
}).compileComponents();
fixture = TestBed.createComponent(AppComponent);
component = fixture.debugElement.componentInstance;
fixture.detectChanges();
mockRouterService = TestBed.get(Router);
mockTitleService = TestBed.get(Title);
}));
it('should set the title from the first router event', async(() => {
expect(mockRouterService.events).toBeTruthy();
expect(mockTitleService.getTitle()).toBe(`Test - Title);
}));
我无法为 testbed.router spyOnProperty,因为它是只读的。是否有任何其他方法可以测试 ngOnInit,因为我无法提供预先设置 event/url 的模拟路由器?
编辑修复:添加 routerState: {} 到我的 mockRouterService 并且测试台现在再次接受这个路由器 prvoider。
在您的情况下,最好使用 RouterTestingModule
而不是路由器模拟。问题的根源是您的模拟缺少组件使用的某些功能。这个 SO RouterTestingModule
用法的一个很好的例子。