我对业力v1.4有问题。测试框架。
我所有的单元测试现在都失败,错误为Cannot read property 'assertPresent' of undefined at resetFakeAsyncZone
我已经在寻找解决方案并对其进行了测试,但不幸的是没有帮助。 解决方案建议我应该更改test.js文件中的导入顺序。我已经做到了。
这是我正在使用的建议顺序,但仍然失败:
import 'zone.js/dist/zone.js'; // 1st
import 'zone.js/dist/async-test'; // 2nd
import 'zone.js/dist/fake-async-test'; // 3rd
import 'zone.js/dist/long-stack-trace-zone'; // 4th
import 'zone.js/dist/sync-test'; // 5th
import 'zone.js/dist/proxy.js'; // 6th
import 'zone.js/dist/jasmine-patch'; // 7th
PS:我正在使用VS Code,它现在在保存文件时自动对导入进行排序,从而更改了我的自定义导入顺序,在这种情况下,这非常烦人。我不知道如何仅针对特定文件禁用它,因此我必须在记事本中编辑test.js文件。
答案 0 :(得分:6)
使用了哪个版本的zone.js
?
在zone.js
的较新版本中,无需分别加载每个 test lib 。
将以下内容放在test.ts
的顶部。
import 'zone.js/dist/zone-testing';
注意:重要的是,此导入要早于其他任何导入!
答案 1 :(得分:1)
这是订单,您可以添加以下内容:
// tslint:disable-next-line:ordered-imports
禁用下一行的导入顺序
import 'zone.js/dist/long-stack-trace-zone';
import 'zone.js/dist/proxy.js';
import 'zone.js/dist/sync-test';
// tslint:disable-next-line:ordered-imports
import 'zone.js/dist/jasmine-patch';
// tslint:disable-next-line:ordered-imports
import 'zone.js/dist/async-test';
import 'zone.js/dist/fake-async-test';
或将其禁用用于该块
// tslint:disable:ordered-imports
import 'zone.js/dist/long-stack-trace-zone';
import 'zone.js/dist/proxy.js';
import 'zone.js/dist/sync-test';
import 'zone.js/dist/jasmine-patch';
import 'zone.js/dist/async-test';
import 'zone.js/dist/fake-async-test';
像这样运行测试以查看确切的错误:
ng test -sm=false
答案 2 :(得分:1)
最佳解决方案是使用jasmine clock
it('test', () => {
// arrange
const clock = jasmine.clock();
clock.install();
... other arrangements
// act
... actions
clock.tick(2000);
// assert
clock.uninstall();
... asserts
});
答案 3 :(得分:0)
当Jasmine测试使用fakeAsync和tick时,发生此错误。删除fakeAsync / tick解决了此问题。
答案 4 :(得分:0)
在VS Code重新排序我的导入后,我遇到了这个问题。
解决方法是首先包括2个区域的导入-我要添加一个新的答案,b / c zone-testing
必须在zone
之后。 (如果将zone-testing
放在zone
之前,则会出现Zone is not defined in ..../vendor.js
错误)。
这是test.ts
工作文件的完整代码:
import 'zone.js/dist/zone';
import 'zone.js/dist/zone-testing'; // AFTER zone, BEFORE everything else
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
declare const require: {
context(path: string, deep?: boolean, filter?: RegExp): {
keys(): string[];
<T>(id: string): T;
};
};
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
// Then we find all the tests.
const context = require.context('../../', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);