将模拟路由器用于测试台时出现未定义错误

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 用法的一个很好的例子。