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

lew*_*stg 11 javascript zone jasmine angular

我正在使用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();
  });
})
Run Code Online (Sandbox Code Playgroud)

这里是plunker为上述代码.

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

Tim*_*Tim 6

对我来说,如果您卸载时钟,它可以工作beforeEach.它不是茉莉花推荐的,有点奇怪,因为对于卸载它更有意义afterEach.但是uninstall 第一次install通话之前打电话给我修好了.


j3f*_*3ff 5

正如Angular文档中所述,您应该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();
}));
Run Code Online (Sandbox Code Playgroud)

  • 我这样做是为了进行异步测试,但在某些测试中我只想使用`jasmine.clock().mockDate()`来模拟`Date`.不能用`fakeAsync()`来做到这一点 (3认同)