使用 fakeasync 时出错 - 但它在其他地方有效
error using fakeasync - but it works elsewhere
我有一个令人难以置信的问题。我有一些代码正在两个不同的项目中测试,都在 angular 中。在第一个项目中,测试有效,在第二个项目中,我收到以下错误。
TypeError: Cannot read property 'assertPresent' of undefined
我看到 this question 关于这个问题,但他们讨论了所有解决方案导入 zone.js
和顺序等。但是,无论是在我的工作测试项目还是我的非工作项目中,我都没有显式导入 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 使用 electron 而 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 是 angular 10,而 p2 是 angular 11。
同样,代码与测试相同,所以我很难理解为什么在 p2 中出现上述错误。
如有任何线索,我们将不胜感激!
感谢 this comment github post,我发现 P1 缺少 import p2。
在 test.ts
中,karma.conf.js
需要并负责递归加载所有规范文件的文件缺少导入。将它添加到 p2 的 test.ts
解决了问题。
import 'zone.js/dist/zone-testing';
我有一个令人难以置信的问题。我有一些代码正在两个不同的项目中测试,都在 angular 中。在第一个项目中,测试有效,在第二个项目中,我收到以下错误。
TypeError: Cannot read property 'assertPresent' of undefined
我看到 this question 关于这个问题,但他们讨论了所有解决方案导入 zone.js
和顺序等。但是,无论是在我的工作测试项目还是我的非工作项目中,我都没有显式导入 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 使用 electron 而 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 是 angular 10,而 p2 是 angular 11。 同样,代码与测试相同,所以我很难理解为什么在 p2 中出现上述错误。
如有任何线索,我们将不胜感激!
感谢 this comment github post,我发现 P1 缺少 import p2。
在 test.ts
中,karma.conf.js
需要并负责递归加载所有规范文件的文件缺少导入。将它添加到 p2 的 test.ts
解决了问题。
import 'zone.js/dist/zone-testing';