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

14

我正在使用包含“原始”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();
  });
})

这里是上述代码的Plunker。

除了将Angular 2测试与“vanilla”测试分开交付之外,我想知道还有哪些选择。例如,是否可能使用zone来执行Jasmine时钟的工作?例如,在断言之前是否可以使用区域模拟tick或刷新所有已安排的任务?

4个回答

6

如果你在beforeEach中卸载时钟,它对我有效。这并不是Jasmine推荐的做法,有点奇怪,因为为了卸载,使用afterEach更有意义。但是,在第一个install调用之前调用uninstall可以解决问题。


这似乎也解决了我的问题,但我不确定它可能会引起什么影响,因为现在 ZoneJS 函数不再被调用。 - Ido Ran
你是执行“卸载”再“安装”,还是只执行卸载? - Tim
先卸载再安装。据我所知,卸载将重置当前设置的任何时钟函数到真实时钟,然后安装将始终工作,因为导致第一次异常的检查现在总是会通过卸载。现在它对我有用,但如果我运行需要ZoneJS的测试,可能会引起问题。 - Ido Ran

6
Angular文档所述,您应该在@angular/core/testing模块中使用fakeAsync函数体中的tick函数。
使用您的示例和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();
}));

4
我在异步测试中使用这个方法,但是在某些测试中,我只想使用 jasmine.clock().mockDate() 来模拟 Date。使用 fakeAsync() 无法实现这一点。 - Necros
1
我遇到了同样的问题。你能找到一种在Angular2中正确模拟日期的方法吗? - Goutham

4

代码是在这里抛出的。

这意味着 jasmine 被加载之前加载了 Zone.js。请更改加载顺序,始终先加载 Zone。

这是已修复的 plunker 分支:

<script data-require="zone.js@*" data-semver="0.4.1" src="https://cdn.rawgit.com/angular/zone.js/v0.4.1/zone.js"></script>
<script data-require="zone.js@*" data-semver="0.4.1" src="https://cdn.rawgit.com/angular/zone.js/v0.4.1/long-stack-trace-zone.js"></script>
<script data-require="jasmine@*" data-semver="2.4.1" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/boot.js"></script>

https://plnkr.co/edit/6iuvWFOZLqHWJIo4


3
记录一下。为了使其与Karma 1.3和Jasmine 2.5配合使用,我们不得不在配置中覆盖 customContextFile。我们在包括jasmine库之前插入了来自zone.js包的zone.jslong-stack-trace-zone.jsproxy.js。此外,一个全局的 afterEach 块和 jasmine.clock().uninstall() 似乎解决了我们的问题。 - RJo

3

感谢您修复这个问题! - Cameron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接