Angular 测试角度分量时未定义NgZone

Angular 测试角度分量时未定义NgZone,angular,unit-testing,Angular,Unit Testing,我正在开发一个Angular中的日期范围选择器组件,并且很难测试输入值是否错误 我的ngOnInit()有一个 当我试图写一个 茉莉返回: 预期函数将抛出RangeError,但它抛出了TypeError:Cannot 读取未定义的属性“ngZone” 通过对S.O.帖子的研究,我在测试床中创建了一个并提供了它,这只会导致更多的问题,比如“subscribe未定义” 我认为这可能是由于EventEmitter造成的,但我已尝试删除它,并且收到了相同的错误 首先,如何解决NgZone错误?关于这个

我正在开发一个Angular中的日期范围选择器组件,并且很难测试输入值是否错误

我的ngOnInit()有一个

当我试图写一个

茉莉返回:

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

通过对S.O.帖子的研究,我在
测试床
中创建了一个并提供了它,这只会导致更多的问题,比如“subscribe未定义”

我认为这可能是由于EventEmitter造成的,但我已尝试删除它,并且收到了相同的错误

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

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

更新

即使我隔离了输入验证函数,我仍然无法检查该函数是否抛出错误。相反,我必须检查
detectChanges()
,该函数调用了所有其他函数:

expect(() => fixture.detectChanges()).toThrow();
该服务用于访问Api,以支持在ZoneJS空间内外运行代码。但是,如果您在测试中发现使用它很有用,您可以使用以下方法创建服务实例:

let ngService = Testbed.get(NgZone)
如果您的目的是测试组件的生命周期ngOnInit(),Angular已通过使用ComponentFixture在API中为此提供了工具,您可以控制生成changedetection以触发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

  }));

});
description('tests',()=>{
let组分:MyComponent;
let夹具:组件夹具;
beforeach(异步(()=>{
TestBed.configureTestingModule({
进口:[],
声明:[MyComponent],
}).compileComponents();
fixture=TestBed.createComponent(MyComponent);
组件=fixture.componentInstance;
}));
它('simple test',异步(()=>{
fixture.detectChanges();//触发cd并通过它传递组件生命周期
}));
});

第一个问题如果您想在组件内模拟NgZone服务,有几种方法可以模拟?第二个问题,您想测试代码是否只是在该生命周期中运行吗?@Lucho我真的只想测试
ngOnInit()
是否按预期运行。如果我不必模仿NgZone来实现这一点,我也会很高兴。检查发布的答案,这对您有帮助吗?更改调用.detectChanges()的时间似乎已经清除了NgZone错误,但是,我仍然无法测试引发的异常。我将输入检查隔离到一个单独的方法,这也不起作用。有什么想法吗?@Brandon,你的github更新了吗?如果不使用it()测试更新您的帖子示例和您正在使用的方法,我会找到答案。我没有期望trow使用
.validateOptions日期
,而是将其切换到
.fixture.detectChanges
我将您的答案标记为正确,因为移动更改检测是修复NgZone错误的方法,这是我最初的问题。