首页 > 解决方案 > 使用 fakeasync 时出错 - 但它在其他地方有效

问题描述

我有一个令人难以置信的问题。我有一些代码在两个不同的项目中测试,都是有角度的。在第一个项目中,测试工作,在第二个我收到以下错误。

TypeError:无法读取未定义的属性“assertPresent”

我看到了关于这个问题的这个问题,但是他们讨论了导入zone.js和顺序等的所有解决方案。但是,在我的工作测试项目和非工作项目中,我都没有明确地 import zone.js

测试代码会延迟测试 http,因此需要fakeAsync使用tick. 这是测试两个项目中的代码的测试:

it('should throw error if action failed`, fakeAsync(()=>{
    const mockGetActionResponse = {'action' : {'id' : mockActionId, state: 'Failed' }};
    
    service.doAction(mockContent).subscribe(
        () => {},
        err => expect(err).toEqual('Action Failed');
    );

    const postCall = httpTestingController.expectOne(url1);
    expect(postCall.request.method).toEqual('POST');
    expect(postCall.request.body).toEqual(mockContent);

    postCall.flush(mockPostActionResponse);

    tick(config.retryTime);

    const getCall = httpTestingController.expectOne(url2/mockActionId);
    expect(getCall .request.method).toEqual('Get');

    getCall.flush(mockGetActionResponse );
}));

现在在项目 1 中,它运行良好,而在项目 2 中,我得到了上述错误。我在两者中都有相同的进口:

import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import {fakeAsync, TestBed, tick} from '@angular/core/testing';

在我的package.json devDependencies我有以下相似之处:(为方便起见,此处删除了引号)

jasmine-core: 3.6.0,
jasmine-spec-reporter: 6.0.0,
karma: 5.2.3 (p1) / ^5.2.3 (p2)
karma-jasmine: 4.1.0,
karma-jasmine-html-reporter: 1.5.4

现在,在 p2 中,我将 karma-coverage 更新为不再使用instabul,并且 p1 使用电子,而 p2 没有,所以现在我也有以下区别:

karma-coverage-instabul-reporter: 3.0.3, // P1 only
karma-coverage: ^2.0.3, // p2 only
karma-electron: 6.3.1, // p1 only
karma-chrome-launcher: ~3.1.0 // p2 only 
karma-junit-reporter: ^2.0.1 //p2 only

类似的正则依赖:zone.js: 0.11.1 (p1) / ^0.11.2 (p2)

另一个可能值得注意的主要区别是 p1 是 10 度角,而 p2 是 11 度角。同样,代码是相同的,测试也是如此,所以我很难理解为什么在 p2 中我得到上述错误。

任何线索将不胜感激!

标签: angularjasminekarma-jasmine

解决方案


感谢对github 帖子的评论,我发现 P1 缺少导入 p2。

test.ts中,需要karma.conf.js并负责递归加载所有规范文件的文件,缺少导入。将其添加到 p2test.ts解决了该问题。

import 'zone.js/dist/zone-testing';


推荐阅读