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

时间:2017-06-13 11:36:18

标签: angular google-chrome phantomjs karma-jasmine

我使用的是Angular版本“4.2.2”,Angular Cli版本“1.1.1”和zone.js 0.8.12。我之前在Chrome和PhanthomJS中工作的一些单元测试现在失败了,出现以下错误:

ERROR 未捕获的错误:macroTask'setInterval':无法转换为'running',期望状态'scheduled',是'notScheduled'。

之前有人看过这些错误并知道如何修复它们吗?

2 个答案:

答案 0 :(得分:2)

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

我发现这是this link

例如,我正在使用Angular2文档中拼写的intervalTimerfakeAsync技术测试一个可观察的方法,并遇到此错误。 (见下面的测试)

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.');
    }));

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

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

  1. it('#findCaseMasks should show error if error is returned from service', (done) => { component.searchCriteria = new CaseMaskModel(1, 1); caseMaskServiceSpy = spyOn(service, 'findCaseMasks').and.returnValue(Observable.throw('error occured', 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(); }); }); 方法的顶部添加一个变量,该变量与您尝试窥探的服务类型相同,即。 describe
  2. let casemaskService: CaseMaskService;方法的顶部创建一个describe类型的变量,即jasmine.Spy
  3. 将服务变量设置为等同于let casemaskServiceSpy: jasmine.Spy;的相同类型的注入服务,即fixture。 (我通常在同步casemaskService = fixture.debugElement.injector.get(CaseMaskService);方法中执行此操作)
  4. 在任何规范期间的任何时候,只需将beforeEach变量设置为等于spy实例并告诉它返回什么,即spyOn $ {mockCaseMask.caseMaskingId}是更新!caseMaskSpy = spyOn(casemaskService, 'updateCaseMask').and.returnValue(Observable.of(
  5. 此时你可以使用我上面粘贴的代码,应该很好。

答案 1 :(得分:0)

我遇到了这个问题,我正在使用异步和假同步的测试文件中使用可观察对象。

我使用的是zone.js版本0.8.26,并且升级到0.8.29可以解决我的问题,而无需更改代码。