提问者:小点点

角度5


在我的Angular组件中,我使用以下代码创建了两个可观察对象

this.navigationEnd = this.router.events.subscribe((event: any) => {
  // do some stuff
});

if (this.activeRoute.firstChild) {
  this.activeRouteChild = this.activeRoute.firstChild.params.subscribe((routeParams) => {
    // do some stuff
  });
}

如您所见,我订阅了activeRoute和router.events。作为一名优秀的程序员,我确保在使用ngOnDestroy销毁组件时取消订阅两者。

public ngOnDestroy(): void {
  if (this.navigationEnd) {
    this.navigationEnd.unsubscribe();
  }
  if (this.activeRouteChild) {
    this.activeRouteChild.unsubscribe();
  }
}

现在这是伟大的但它是时间来测试这两个项目是取消订阅时销毁组件,这是我有测试

describe('ngOnDestroy', () => {
  it('should unsubscribe from navigationEnd & activeRouteChild on ngOnDestroy', () => {
    // arrange

    fixture.detectChanges();

    // act
    instance.ngOnDestroy();

    // assert
    expect((instance as any).navigationEnd.closed).toBeTruthy();
    expect((instance as any).activeRouteChild.closed).toBeTruthy();
  });
});

我像这样模拟路由器和ActivatedRoute:

class MockRouter {
  // Router
  public events = of(new NavigationEnd(1, 'url/1', 'url/1'));
  public navigate = () => true;
}

class MockActivatedRoute {
  public firstChild = {params: of({id: '1'})};
}

这就是我在提供者数组中声明它们的方式:

{provide: Router, useClass: MockRouter },
{provide: ActivatedRoute, useValue: MockActivatedRoute}

模拟路由器工作得很好,但是它们是MockActivatedRoute的一个问题,因为我认为我不正确地实现了first儿童属性。我收到错误“TypeError:无法读取未定义的“关闭”属性——我的问题是如何正确模拟ActivatedRoute和它的first儿童属性?


共1个答案

匿名用户

你不需要一个类来模拟子路由,只要在你的测试中通过用你必要的参数调用导航来导航那里。你可以通过测试你的应用程序一开始没有路由来验证它(检查你的路由路径是初始路由),然后通过检查你导航后的路由是否改变(检查你的路径是你导航到的)。然后,你可以检查你的组件在此之后是否退订。

注意:就测试而言,我发现测试你没有写的API通常没有用,除非你为它们做出贡献。un订阅()有效,我们知道这是因为Angular的贡献者已经为它编写了测试。自己测试它,虽然不错,但通常证明是浪费时间,因为它已经在Angular源代码中测试过了。