【发布时间】:2017-11-15 11:23:41
【问题描述】:
我的一个组件在ngOnInit 中使用了 setTimeout,例如:
ngOnInit() {
setTimeout(() => {
// do some setup stuff using FormBuilder
}, 100);
}
在此组件的单元测试中,我需要监视使用 FormBuilder 以编程方式构建的控件之一的方法之一,因此我在 beforeEach 中执行此操作:
describe('testing something', () => {
beforeEach(() => {
spyOn(component.form.controls.myControl, 'enable');
});
it('does something', () => {
// test stuff
});
});
在添加超时之前,测试运行良好。如何让beforeEach 在ngOnInit 方法中等待100 毫秒超时?
我尝试将async 和fakeAsync 添加到外部描述中,例如像这样:
describe('testing something', <any>fakeAsync(() => {
...
}));
或
describe('testing something', async(() => {
...
}));
但在第一种情况下,fakeAsync 我在测试运行程序中看到一条消息错误:应在“ProxyZone”中运行,但未找到。,在第二种情况下如果它甚至不运行测试。我还尝试将it 方法包装在fakeAsync 中,但这并不能延迟beforeEach
我尝试将beforeEach 中的spyOn 方法包装在setTimeout 中,但这似乎没有任何效果,即测试以同样的方式失败。
我也尝试过将fakeAsync 与beforeEach 一起使用,如下所示:
beforeEach(<any>fakeAsync(() => {
tick(100);
spyOn(component.modelForm.controls.myControl, 'enable');
}));
但这也不起作用。它不会导致任何错误,但我要监视的方法还不存在,即使在滴答声之后也是如此。
如何强制beforeEach 等待ngOnInit() 中的超时?有没有可能?
【问题讨论】:
-
我知道
ngOnInit中的setTimeout很糟糕。不幸的是,我无权更改它。 -
只是为了确定,在 async() 测试中运行时,您是否使用了 whenStable(),而在使用 fakeAsync() 运行时,您是否使用了 tick()?
-
我没有尝试
whenStable,但我确实在beforeEach中尝试了tick(100),但这并没有帮助 -
这就是 fakeAsync 的用途,它应该可以按预期工作而无需额外的操作。这可能与测试设置有关。复制它的方法会很有用 - stackblitz.com 或 github 存储库。
-
但是
fakeAsync是否与describe而不是it一起使用?我在同一文件的其他测试中使用fakeAsync和it方法
标签: javascript angular asynchronous jasmine