加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – 测试未捕获错误:macroTask’setInterval’:无法转

发布时间:2020-12-17 17:09:55 所属栏目:安全 来源:网络整理
导读:我使用的是Angular版本“4.2.2”,Angular Cli版本“1.1.1”和zone.js 0.8.12.以前在Chrome和PhanthomJS中工作的一些单元测试现在失败,出现以下错误: 错误 未捕获错误:macroTask’setInterval’:无法转换为’running’,期望状态’scheduled’,’notSchedul
我使用的是Angular版本“4.2.2”,Angular Cli版本“1.1.1”和zone.js 0.8.12.以前在Chrome和PhanthomJS中工作的一些单元测试现在失败,出现以下错误:

错误
未捕获错误:macroTask’setInterval’:无法转换为’running’,期望状态’scheduled’,’notScheduled’.

任何人以前都看过这些错误并知道如何修复它们?

解决方法

好吧,经过一些研究后,我发现大多数人(甚至是Angular人)都说自己使用async或fakeAsync与涉及intervalTimer(与Observable方法相同)的代码根本无法完成.

我发现这是在this link

例如,我正在使用Angular2文档中拼写出来的fakeAsync和tick技术测试一个可观察的方法,并且遇到了这个错误. (见下面的测试)

it('#findCaseMasks should show error if error is returned from service',fakeAsync(() => {
        component.searchCriteria = new CaseMaskModel(1,1);
        caseMaskServiceSpy = spyOn(service,'findCaseMasks').and.returnValue(Observable.throw('error occured',Scheduler.async));
        component.findCaseMasks();
        expect(component.error).toBeNull;
        tick();
        fixture.detectChanges();
        expect(component.error).toEqual('Something went wrong. Please contact helpdesk if the issue persists.');
    }));

上面的测试改为你在下面看到的,测试开始正常.

it('#findCaseMasks should show error if error is returned from service',(done) => {
        component.searchCriteria = new CaseMaskModel(1,Scheduler.async));
        component.findCaseMasks();
        expect(component.error).toBeNull;
        caseMaskServiceSpy.calls.mostRecent().returnValue.subscribe(
            () => { //success
                //put code here if testing for success
            },err => { //error
                //put code here if testing for error

                fixture.detectChanges();
                expect(component.error).toEqual('Something went wrong. Please contact helpdesk if the issue persists.');
                done();
            });
    });

所以基本上你必须监视使用`jasmine.Spy’注入组件的服务,然后订阅它最近的调用.然后,您有熟悉的订阅语法,以检查错误并检查是否成功.

作为参考,窥探注入服务的步骤如下:

>在describe方法的顶部添加一个变量,该变量与您尝试窥探的服务类型相同,即. let casemaskService:CaseMaskService;
>在describe方法的顶部创建一个jasmine.Spy类型的变量,即let casemaskServiceSpy:jasmine.Spy;
>将服务变量设置为夹具的相同类型的注入服务,即casemaskService = fixture.debugElement.injector.get(CaseMaskService);. (我通常在同步的beforeEach方法中执行此操作)
>在任何规范期间的任何时候,只需将spy变量设置为等于spyOn实例并告诉它返回什么,即caseMaskSpy = spyOn(casemaskService,’updateCaseMask’).and.returnValue(Observable.of(${mockCaseMask .caseMaskingId}已更新!,Scheduler.async));

那时你可以使用我上面粘贴的代码,应该很好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读