运行ng test时如何避免用角度重建所有模块?

时间:2018-07-02 11:14:46

标签: angular testing angular-cli

我正在使用Jenkins管道来构建我的angular 4应用程序。我正在使用angular-cli ng build -prodng test来运行测试。测试的步骤非常缓慢,比构建本身要花费更多的时间。我发现发生这种情况是因为尽管构建刚刚完成,但在此步骤中所有模块都已重新构建。因为模块已经构建,所以没有办法避免在测试阶段进行重建吗?

2 个答案:

答案 0 :(得分:1)

在我的评论之后,这是一个如何在没有Angular的情况下测试Angular组件的示例。

假设您有一个非常简单的路由组件,如下所示:

export class MyRoutedComponent {
  constructor(private router: Router) {}

  navigateTo(route: string) {
    this.router.navigate(route);
  }
}

通常的测试是为依赖项提供模拟,并为此使用Testbed。

好吧,您没有被迫这样做,甚至the testing guide都这样告诉您:

  

Angular TestBed促进了这种测试,如以下各节所示。但是在许多情况下,仅在不涉及DOM的情况下单独测试组件类,就可以通过一种更容易,更明显的方式来验证组件的许多行为。

您可以做的是

describe('MyRoutedComponent', () => {
  const routerMock = {
    navigate: () => null
  };

  const instance = new MyRoutedComponent(routerMock);

  it('should call router.navigate when navigateTo()', () => {
    spyOn(routerMock, 'navigate');
    instance.navigateTo('foo');
    expect(routerMock.navigate).toHaveBeenCalledWith('foo');
  });
});

如您所见,它可以像Testbed一样对组件进行测试,但是由于它不依赖任何HTML,因此按照指南的建议,它是一种更好的解决方案。

答案 1 :(得分:0)

您可以使用我写的一个小帮手precompileForTests()中的s-ng-dev-utils函数。它将在套件开始时为您的测试编译所有内容,并使Angular重新使用每个测试的结果。希望对您有所帮助!