Angular 角度单元测试中的事件发射器是';我没打电话

Angular 角度单元测试中的事件发射器是';我没打电话,angular,unit-testing,jestjs,click,angular-event-emitter,Angular,Unit Testing,Jestjs,Click,Angular Event Emitter,考虑到这个成分 导出类MyComponent{ @ActivateEditMode上的输出()为新的EventEmitter(); 构造函数(){} emitActivateEditMode(标志:布尔值){ 此.onActivateEditMode.emit(标志); } …这个模板 编辑 …然后此测试失败: description('MyComponent',()=>{ …(试验台进口等) 在每个之前(()=>{ fixture=TestBed.createComponent(MyCom

考虑到这个成分

导出类MyComponent{
@ActivateEditMode上的输出()为新的EventEmitter();
构造函数(){}
emitActivateEditMode(标志:布尔值){
此.onActivateEditMode.emit(标志);
}
…这个模板

编辑
…然后此测试失败:

description('MyComponent',()=>{
…(试验台进口等)
在每个之前(()=>{
fixture=TestBed.createComponent(MyComponent);
组件=fixture.componentInstance;
spyOn(组件“emitActivateEditMode”);
fixture.detectChanges();
});
它('单击时应激活编辑模式',()=>{
const onactivateditmodespy=jest.spyOn(
component.onActivateEditMode,
“发射”
);
const startEditProjectBtn=fixture.debugElement.nativeElement.querySelector(
“[数据测试开始编辑项目btn]”
);
startEditProjectBtn.dispatchEvent(新事件('click');//startEditProjectBtn.click()也不会更改结果
fixture.detectChanges();
期望(component.onActivateEditMode.emit).已被调用(true);
//expect(onActivateEditModeSpy)。与(true)一起调用…也不会更改结果
});
});
测试输出为:

Expected: true
Number of calls: 0

该功能在浏览器中工作,但此测试设置中的某些内容是错误的。

我假设您同时使用Jasmine和Jest。问题是当您监视该功能时(
spyOn
),您实际上只是监视函数的调用,而实现细节会消失。要使实现细节得体,您可以执行
spyOn(组件,'emitActivateEditMode')。和.callThrough();
,但我认为您不需要它

describe('MyComponent', () => {

  ... (TestBed imports etc)

  beforeEach(() => {
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    // remove the mock/spyOn to the function emitActivateEditMode
    fixture.detectChanges();
  });

  it('should activate editmode on click', () => {
    // spy on emit calls on onActivatedEditMode
    const emitSpy = spyOn(component.onActivateEditMode, 'emit');
    const startEditProjectBtn = fixture.debugElement.nativeElement.querySelector(
      '[data-test-start-edit-project-btn]'
    );
    startEditProjectBtn.click();
    fixture.detectChanges(); // fixture.detectChanges is not needed here, only if you want to see the update in the HTML.
    expect(emitSpy).toHaveBeenCalledWith(true);
});

不要监视被测系统的某些部分。如果要检查组件
@Output
的发射,请使用例如。