【问题标题】:Angular2 unit testing beforeEach block too slowAngular2在每个块之前进行单元测试太慢了
【发布时间】:2016-10-20 14:17:23
【问题描述】:

这是我在每个单元测试之前的块。它工作得很好,为每个测试提供了一个新的组件实例。但是,执行 beforeEach 块大约需要 4 秒。当你有 200 次测试时,这很慢!

我想将大部分代码移动到 beforeAll 块(如果您使用 Jasmine done() 回调而不是使用异步,这将有效)但我仍然无法为每个测试创建一个新实例。某些测试失败是因为唯一的实例已被先前的测试篡改。

我该怎么...

  1. 创建一个新的组件实例,而无需为每个测试执行这个耗时的代码。

  1. 将实例重置为未篡改状态。
beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [AppModule],
      providers: [{provide: APP_BASE_HREF, useValue: '/'},
        MockBackend,
        BaseRequestOptions,
        {
          provide: Http,
          useFactory: (pBackend: MockBackend, pOptions: BaseRequestOptions) => {
            return new Http(pBackend, pOptions);
          },
          deps: [MockBackend, BaseRequestOptions]
        }]
    }).compileComponents()
      .then(() => {
        fix = TestBed.createComponent(Route1DetailComponent);
        instance = fix.componentInstance;
        injector = fix.debugElement.injector;
      });
}));

【问题讨论】:

  • 也许AppModule 是问题所在。只需添加测试实际需要的内容即可尝试。就个人而言,我从不使用 AppModule 进行单元测试。在进行单元测试时,我尽量减少所有外部变量。
  • 这取决于为什么需要这么长时间。但是关于单元测试和模块的事情是只有当前单元所属的模块应该被引导。
  • +1 感谢你们,我理解并同意我的方法可能会更好 - 但我仍然不高兴你必须再次重新加载所有导入以获得新的实例已经加载的组件,对我来说似乎不对
  • 这是单元测试的目的。以前的测试不应该有机会影响当前的测试,但是如果将beforeEach 替换为beforeAll,就会发生这种情况。
  • 仅供参考,beforeAll 不起作用的原因是角度测试基础架构使用全局beforeEach 重置了TestBed;可以看到注册了here

标签: unit-testing angular


【解决方案1】:

我编写了一个小函数来预编译给定模块的所有内容,以便在每个测试中重复使用。默认情况下,Angular 每次都会重新编译所有内容,但这会将它们设置为好像它们是在测试套件开始时使用 AoT 编译的。它是s-ng-dev-utils 中的precompileForTests() 函数。看看 - 我希望它会有所帮助!

【讨论】:

    【解决方案2】:

    我决定采用 cmets 中 @peeskillet 和 @estus 建议的方法。谢谢两位。

    确定要包含哪些组件/模块成为我的下一个问题,这里解决了 ..

    How do you know which components to import when unit testing?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2019-03-22
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多