测试无法在resetFakeAsyncZone读取未定义的属性'assertPresent'

时间:2018-06-22 07:40:11

标签: angular testing karma-runner zone.js

我对业力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文件。

5 个答案:

答案 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);