如何修复“错误:预期在 'ProxyZone' 中运行,但未找到。”在摩卡测试?

Posted

技术标签:

【中文标题】如何修复“错误:预期在 \'ProxyZone\' 中运行,但未找到。”在摩卡测试?【英文标题】:How to fix "Error: Expected to be running in 'ProxyZone', but it was not found." in mocha testing?如何修复“错误:预期在 'ProxyZone' 中运行,但未找到。”在摩卡测试? 【发布时间】:2019-09-25 19:11:51 【问题描述】:

我正在尝试使用 mochachai 测试我的英雄之旅 Angular 应用程序webpack。我关注了this post 并在this guide 的帮助下完成了设置并修复了构建错误并启动并运行了测试。

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

通过测试

  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: Expected to be running in 'ProxyZone', but it was not found,因为我认为这是 zone.js 使用 mocha 的一些错误,但没有成功。

另外,我曾尝试关注Mocha Documentation 进行异步测试,但作为初学者,这对我来说有些困难。

我尝试过用谷歌搜索,甚至在 stack-overflow 中搜索过,但是关于 Angular 测试 的帖子数量有限>摩卡。 感谢您提供任何帮助解决此问题。

【问题讨论】:

我今天遇到的第 5 个 Angular 特定错误。这个框架真是太费时间了。 【参考方案1】:

2021

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

在 Karma/Jasmine 测试中拥有多个 beforeEach 是可以的。此外,由于compileComponents 返回一个承诺,OP 需要其中的await,或者使用waitForAsync【参考方案3】:

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

删除它为我解决了问题。

【讨论】:

这是我的问题。我偶然将 fackAsync() 放在了我的 describe() 函数周围,而不是放在了 it() 函数周围。 ? 1 周内我第二次需要打开 Google 才能看到这篇 SO 帖子?【参考方案4】:

这是这个问题的答案。

Angular 5 Testing: Expected to be running in 'ProxyZone', but it was not found

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

是的,问题是我需要测试异步代码,并且在进入该部分时删除异步不是一个选项。

以上是关于如何修复“错误:预期在 'ProxyZone' 中运行,但未找到。”在摩卡测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞