角单元测试随机失败,原因是异步回调没有用5000ms调用(由jasmine.DEFAULT_TIMEOUT_INTERV



我已经用异步单元测试编写了以下代码,但这些代码都是随机失败的,而且不一致。有人能帮我怎么了吗?

测试用例是:当用户按下键盘键W(转到上一个文档(和S(转到下个文档(时,在UI上所选的文档(行(应该在表中更改。

it('When user press key W and S then should be able navigate to previous and next document', async () => {
createTestBed();
fixture.detectChanges();
const searchResultStub = MockNgRedux.getSelectorStub(['documentSearch', 'results']);
searchResultStub.next(getSearchResult());
searchResultStub.complete();
fixture.detectChanges();

const spyPrevElement = spyOn(comp.documentSearchResult._tableService, 'selectPrevElement').and.callThrough();
const spysNextElement = spyOn(comp.documentSearchResult._tableService, 'selectNextElement').and.callThrough();

await TestUtil.SleepForASecond(0);
document.dispatchEvent(TestUtil.createKeyUpEvent("S"));
fixture.detectChanges();
expect(spysNextElement).toHaveBeenCalled();
expect(spysNextElement).toHaveBeenCalledTimes(1);

document.dispatchEvent(TestUtil.createKeyUpEvent("W"));
fixture.detectChanges();
expect(spyPrevElement).toHaveBeenCalled();
expect(spyPrevElement).toHaveBeenCalledTimes(1);
});

TestUtil.ts文件:

static async SleepForASecond(ms) {
await new Promise(resolve => setTimeout(resolve, ms);
}
static createKeyUpEvent(key: string, isCapsOn: boolean = false) {
const keyUpEvent: Event = new KeyboardEvent('keyup', {
'key': key,
'modifierCapsLock': isCapsOn
});
return keyUpEvent;
}

与此类似,其他测试由于异步而失败,并等待出现以下错误。有人能有个主意吗?

Error: Timeout - Async callback was not invoked with 5000ms(set by jasmine.DEFAULT_TIMEOUT_INTERVAL) at <Jasmine>

观察结果:DOCKER集装箱内的测试案例更多失败。测试有时会顺利通过,但有时会失败

默认情况下,Jasmine(您的测试框架(将等待5秒,等待异步方法回调。如果没有,你会在这里看到错误。它真正说的是,异步方法被调用了,五秒钟过去了,但它没有返回,所以抛出了一个错误。

测试随机失败的原因是,有时异步函数调用会按时返回,有时则不然。

根据jasmine文档,您可以通过以下行全局更改默认超时:

jasmine.DEFAULT_TIMEOUT_INTERVAL = time;

其中time是所需的最大超时值(以毫秒为单位((10000表示10秒(。

如果您希望为每个特定实例设置它,您可以在此处的文档中阅读其完整语法:https://jasmine.github.io/2.1/introduction.html#section-47.

最新更新