Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript zone.js与Jasmine之间的冲突';时钟_Javascript_Angular_Jasmine_Zone - Fatal编程技术网

Javascript zone.js与Jasmine之间的冲突';时钟

Javascript zone.js与Jasmine之间的冲突';时钟,javascript,angular,jasmine,zone,Javascript,Angular,Jasmine,Zone,我正在使用Jasmine测试套件,该套件包括“香草”Jasmine测试和一些Angular 2组件的Jasmine测试。由于Angular 2的包含,zone.js被加载。这与茉莉花的时钟产生了冲突。例如,以下测试失败,错误为:error:Jasmine Clock无法安装自定义全局计时器函数。时钟是否已安装? describe('an async test with zone.js present', function() { beforeEach(function() { jas

我正在使用Jasmine测试套件,该套件包括“香草”Jasmine测试和一些Angular 2组件的Jasmine测试。由于Angular 2的包含,zone.js被加载。这与茉莉花的时钟产生了冲突。例如,以下测试失败,错误为:
error:Jasmine Clock无法安装自定义全局计时器函数。时钟是否已安装?

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测试与“香草”测试分开进行之外,我想知道有哪些选项可用。例如,是否可以在区域中执行Jasmine时钟的工作?例如,是否可以在断言之前用区域模拟勾号或刷新所有计划任务

对我来说,如果你在每次之前卸载
中的时钟,它就会工作。jasmine不推荐它,这有点奇怪,因为对于卸载来说,在每次卸载后使用
更有意义。但是在第一次
安装之前调用
卸载
为我修复了它。

如上所述,您应该在
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();
}));

抛出这个的代码


这意味着jasmine是在Zone.js之前加载的。切换装载顺序。始终需要首先加载区域。

这已由解决。
zone.js
和future
angular
将支持
jasmine.clock()。为了让它与Karma 1.3和Jasmine 2.5一起工作,我们必须在配置中覆盖
customContextFile
。在包含jasmine库之前,我们从zone.js包中插入了
zone.js
long stack trace zone.js
、和
proxy.js
。此外,在每个
块之后使用
jasmine.clock().uninstall()
的全局
似乎可以解决使用问题。我这样做是为了异步测试,但在一些测试中,我只想使用
jasmine.clock().mockDate()
来模拟
日期
。使用
fakeAsync()
无法做到这一点,我遇到了同样的问题。你能找到一种在Angular2中正确模拟日期的方法吗?这似乎也解决了我的问题,但我不确定这可能会导致什么,因为现在不再调用ZoneJS函数。你是先卸载后安装还是先卸载。如果卸载将重置当前设置为实际时钟的时钟功能,那么安装将始终工作,因为首先导致异常的检查现在将始终通过,因为卸载。它现在对我有效,但如果我要运行一个需要ZoneJS的测试,它可能会导致问题。谢谢你修复这个问题!