我不确定为什么更改事件没有触发,因此也没有触发我为更改事件注册的函数。
我知道当我运行它时它可以工作,但我无法在规范中得到它。
这是我所说的示例演示... 如您从日志中看到的那样,切换永远不会被调用:https://stackblitz.com/edit/angular-material-slide-toggle-test-utmbmy?file=app%2Fhello.component.spec.ts
大致上,这是我的代码...
component.html:
<mat-slide-toggle [checked]="useDefault" (change)="toggle($event)"></mat-slide-toggle>
组件.ts:
...
toggle(event: MatSlideToggleChange) {
console.log('Toggle fired');
this.useDefault = event.checked;
}
在我的 spec.ts 文件中:
it('should trigger toggle...', () => {
const componentDebug = fixture.debugElement;
const slider: MatSlideToggle =
componentDebug.query(By.css('form mat-slide-toggle')).componentInstance;
console.log('before ' + slider.checked);
slider.toggle();
fixture.detectChanges();
console.log('after ' + slider.checked);
console.log('useDefault ' + component.useDefault);
});
after
日志确实打印出了 slider.checked
的值与 before
相反。但是,component.useDefault
的值保持不变,并且在 toggle
函数中的日志语句从未被调用,这意味着它从未被触发。
为什么会出现这种情况,我该如何解决?
我试过将整个内容放入 fakeAsync
,使用 tick
,并将“after”代码放入 fixture.whenStable()
和 fixture.whenRenderingDone()
中。
在 TestBed
的 import
中,我有一个 NoopAnimationsModule
。
useDefault
是什么?它来自于mat-slide-toggle
吗?还是你创建的指令? - Leo CaseirouseDefault
只是一个拼写错误,应该是[checked] =“useDefault”
。但是,我稍微修改了您的组件,使其更符合我的要求,即从useDefault = true
开始。我只添加了一些日志记录语句。现在,由于我无法理解的原因,toggle
日志不再显示:https://stackblitz.com/edit/angular-material-slide-toggle-test-utmbmy?file=app%2Fhello.component.spec.ts - user1902183componentDebug.query(By.css('mat-slide-toggle')).nativeElement.dispatchEvent(new Event('change'));
你可能还需要以某种方式模拟MatSlideToggleChange对象。 - G. Tranter