Javascript zone.js与Jasmine之间的冲突';时钟
我正在使用Jasmine测试套件,该套件包括“香草”Jasmine测试和一些Angular 2组件的Jasmine测试。由于Angular 2的包含,zone.js被加载。这与茉莉花的时钟产生了冲突。例如,以下测试失败,错误为: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
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
和futureangular
将支持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的测试,它可能会导致问题。谢谢你修复这个问题!