【问题标题】:NgZone undefined when testing Angular component测试 Angular 组件时未定义 NgZone
【发布时间】:2018-11-14 02:03:05
【问题描述】:

我正在 Angular 中开发一个日期范围选择器组件,并且在测试输入值是否错误时遇到了困难。

我的 ngOnInit() 执行 check for min/max date values

当我尝试写test for this case

茉莉花归来:

预期函数会抛出 RangeError,但它会抛出 TypeError: Cannot 读取未定义的属性“ngZone”。

研究 S.O.帖子,导致我创建了一个mock NgZone class 并在TestBed 中提供它,这只会导致更多问题,例如“订阅未定义”。

我认为这可能是由 EventEmitter 引起的,但我尝试将其删除,但我收到了相同的错误。

首先,如何解决 NgZone 错误?有几个 S.O.关于这个主题的帖子,但我似乎做得不够。

其次,如果传入错误的值,我如何正确测试我的ngOnInit() 的行为是否符合预期?

更新

即使我已经隔离了我的输入验证函数,我仍然无法检查该函数是否引发了错误。相反,我必须检查detectChanges(),这是调用其他所有内容的函数:

expect(() => fixture.detectChanges()).toThrow();

【问题讨论】:

  • 第一个问题,如果您只想在组件中模拟 NgZone 服务,有几种模拟方法?第二个问题,您是否要测试代码是否只是在该生命周期中运行?
  • @Lucho 我真的只是希望能够测试ngOnInit() 的行为是否符合预期。如果我不必模拟 NgZone 来实现这一点,我会很高兴。
  • 查看已发布的答案,对您有帮助吗?

标签: angular unit-testing


【解决方案1】:

NgZone 服务用于访问 Api 以支持在 ZoneJS 空间内外运行代码。但是,如果您发现在测试中使用它很有用,您可以使用以下方法创建服务实例:

let ngService = Testbed.get(NgZone)

如果您的目的是测试组件的生命周期 ngOnInit(),Angular 已在 Testbed API 中为此提供了工具,您可以使用 ComponentFixture 在其中控制生成更改检测以触发 ngOnInit,如下所示:

describe('tests', () => {

  let component: MyComponent;
  let fixture: ComponentFixture<MyComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
        imports: [ ],
        declarations: [ MyComponent ],
    }).compileComponents();
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;

  }));


  it('simple test', async(() => {
    fixture.detectChanges(); // triggers cd and passes through component lifecycle ngOnInit

  }));

});

【讨论】:

  • 更改 .detectChanges() 调用的时间似乎已经清除了 NgZone 错误,但是,我仍然无法测试抛出的异常。我将输入检查隔离到一个单独的方法中,但这也不起作用。有什么想法吗?
  • @Brandon,你的 github 更新了吗?如果不使用 it() 测试和您正在使用的方法更新您的帖子示例
  • 我明白了。而不是期待.validateOptionDates trow,我不得不将它切换到.fixture.detectChanges
  • 我将您的答案标记为正确,因为移动更改检测是修复 NgZone 错误的原因,这是我最初的问题。
猜你喜欢
  • 2019-03-26
  • 2019-07-15
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多