18

我正在尝试使用mochachaiwebpack测试我的英雄之旅 Angular 应用程序。我已经关注了这篇文章并在本指南的帮助下完成了设置并修复了构建错误并进行了测试并运行。

async()但是,我的测试失败了,除了我没有在beforeEach钩子中使用的测试用例。

通过测试

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [HeroService, MessageService]
    });
    httpTestingController = TestBed.get(HttpTestingController);

    let mockHeroes = [...mockData];
    let mockHero = mockHeroes[0];
    // let mockId = mockHero.id;

    heroService = TestBed.get(HeroService);
  });

  afterEach(() => {
    httpTestingController.verify();
  });

  it('is created', () => {
    expect(heroService).to.exist;
  });

未通过测试

//imports
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { DashboardComponent } from './dashboard.component';
import { HeroSearchComponent } from '../hero-search/hero-search.component';

import { RouterTestingModule } from '@angular/router/testing';
import { HeroService } from '../hero.service';
import { expect } from 'chai';

...

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [DashboardComponent, HeroSearchComponent],
      imports: [RouterTestingModule.withRoutes([])],
      providers: [{ provide: HeroService, useValue: heroService }]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(DashboardComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should be created', () => {
    expect(component).to.exist;
  });

错误堆栈跟踪

1) 仪表板组件

  "before each" hook for "should be created":
Error: Expected to be running in 'ProxyZone', but it was not found.
 at Function.ProxyZoneSpec.assertPresent (node_modules\zone.js\dist\proxy.js:42:19)
 at runInTestZone (node_modules\zone.js\dist\async-test.js:202:23)
 at D:\Practice\Tour-Of-Heroes\node_modules\zone.js\dist\async-test.js:185:17
 at new ZoneAwarePromise (node_modules\zone.js\dist\zone-node.js:910:29)
 at Context.<anonymous> (node_modules\zone.js\dist\async-test.js:184:20)

我已经尝试过Angular 5 Testing: E​​xpected to be running in 'ProxyZone',但没有找到它,因为我认为这是zone.js使用mocha的一些错误,但没有成功。

另外,我尝试按照Mocha 文档进行异步测试,但作为初学者,这对我来说有点困难。

我尝试过谷歌搜索,甚至在stack-overflow中搜索过,但是关于使用mocha进行Angular 测试的帖子数量有限。感谢您提供任何帮助。

4

5 回答 5

44

fakeAsync我在describe函数中意外使用时遇到了同样的问题。

删除它为我解决了这个问题。

于 2020-07-13T09:02:28.290 回答
3

这是这个问题的答案。

Angular 5 测试:预计将在“ProxyZone”中运行,但未找到

基本上这个异常是因为 async 关键字的位置不正确。从 beforeEach 中删除 async 并将其添加到“it”

it('should be created', fakeAsync(() => {
    expect(component).to.exist;
  });
于 2019-12-30T13:31:28.770 回答
1

我有同样的问题,asyncbeforeEach(和it)中删除解决了这个问题。该错误消息根本没有帮助,但我想从它生成的位置来检测根本原因并不容易。

于 2019-10-18T16:35:08.227 回答
0

我在这里看到了一些问题。

你有 2 个 beforeEach。你应该只有1个。如果你的测试代码块有异步,那么你需要在一个函数上调用await,和/或使用flush或tick来推进时间。我通常将 fakeAsync 用于可观察对象,将 async/await 用于真正的异步方法。

对于这个特定的示例,您根本不需要异步。

于 2020-07-25T01:28:31.930 回答
0

2021

添加下面的行作为第一次导入到规范文件为我解决了这个问题:

import 'zone.js/dist/zone-testing';
于 2021-11-24T11:39:20.530 回答