单元测试异步代码,包括Angular中的setInterval

时间:2020-06-15 18:26:03

标签: angular unit-testing asynchronous

我正在使用Angular 7 +。

setInterval

我有一个代码,其中有一个1000 milliseconds方法,该方法调用服务的url方法以每隔test检索数据。另请注意,我不希望我的程序先等待1000毫秒,然后再调用url方法,即为什么我预调用方法 只一次 < / em>之前的setInterval。让我知道如何Problem Statement:完全相同的行为。另外,请不要为实施而烦恼,因为它是根据我无法透露的业务要求完成的。

getDataFromUrl

假设我有一个URL,我每隔1秒检查一次我是否正在获取数据。对该网址的调用是在函数service内,注入组件的someStorage = {}; constructor(private service: someService){} ngOnDestroy(){ clearInterval(this.clearPeriodicRefresh); } ngOnChanges(){ let context = this; this.periodicRefresh(context); this.clearPeriodicRefresh = setInterval(function(){ this.periodicRefresh(context); },1000); } periodicRefresh(self){ self.service.getDataFromUrl(url).subscribe(res => { someStorage[res] = true; }, err =>{ console.log(" Error Occured "); }); } 内进行的。

请参考下面的代码。

it('should check for async data from url', fakeAsync()=>{
    someServiceStub.getDataFromUrl.and.returnValue(of("chandni chowk"));
    fixture.detectChanges();
    expect(component.someStorage["chandni chowk"]).toBe(true); // executes successfully
    
    setInterval(()=>{
        someServiceStub.getDataFromUrl.and.returnValue(of("delhi"));    
    },1000);
    
    tick(1000); // in milliseconds
    discardPeriodicTasks();
    
    expect(component.someStorage["delhi"]).toBe(true);          // throws error
    
}));

现在我正在对这样的代码进行单元测试:

ERROR : expected undefined to be true

第二个Expect语句显示:

tick(2000)

我不知道为什么。但是,如果我执行的是 tick(1000) 而不是 NOTE ,则它可以工作。再次,我不确定为什么它会更早被跳过。

tick(1900) :在1000到2000之间的任何计时器,例如直到{{1}}都抛出相同的错误,并且在2000毫秒之后的任何时间都可以正常工作。

如果有其他方法,也请告诉我如何编写更好的测试。

0 个答案:

没有答案