zone.js和Jasmine的时钟之间的冲突

时间:2016-09-20 18:00:40

标签: javascript angular jasmine zone

我正在使用Jasmine测试套件,其中包括“vanilla”Jasmine测试以及一些Angular 2组件的Jasmine测试。由于Angular 2的包含,zone.js被加载。这与Jasmine的时钟产生了冲突。例如,以下测试失败,错误为Error: Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?

describe('an async test with zone.js present', function() {
  beforeEach(function() {
    jasmine.clock().install();
  });

  afterEach(function() {
    jasmine.clock().uninstall();
  });

  it('cannot install jasmine\'s mock clock', function() {
    var callback = jasmine.createSpy('setTimeoutCallback')
    setTimeout(callback, 55);
    jasmine.clock().tick(56);
    expect(callback).toHaveBeenCalled();
  });
})

Here是上述代码的掠夺者。

与“vanilla”测试分开提供Angular 2测试时,我不知道可能有哪些选项。例如,是否可以使用区域执行Jasmine时钟的工作?例如,是否可以在声明之前模拟带区域的刻度或刷新所有计划任务?

4 个答案:

答案 0 :(得分:6)

对我来说,如果您在beforeEach中卸载时钟,它就有效。它不是茉莉花推荐的并且有点奇怪,因为对于卸载它使用afterEach更有意义。但是,在第一次uninstall来电之前调用install 之前调用{strong}修正了它。

答案 1 :(得分:5)

正如Angular documentation所述,您应该在tick机构中使用fakeAsync功能,该机构是@angular/core/testing模块的一部分。

使用您的示例和TypeScript,它看起来像这样......

import { fakeAsync, tick } from '@angular/core/testing';

...

it('cannot install jasmine\'s mock clock', fakeAsync(() => {
   var callback = jasmine.createSpy('setTimeoutCallback')
   setTimeout(callback, 55);
   tick(56);
   expect(callback).toHaveBeenCalled();
}));

答案 2 :(得分:3)

抛出此here的代码。

这意味着在Zone.js之前加载了茉莉花。切换装载顺序。区域始终需要先加载。

答案 3 :(得分:1)

这已由https://github.com/angular/zone.js/pull/1009解决。 zone.js和将来angular将支持jasmine.clock()