【发布时间】:2018-11-16 17:26:12
【问题描述】:
我不确定为什么 change 事件没有触发,因此没有触发我为 change 事件注册的函数。
我知道这在我运行时有效,但我无法在规范中得到它。
这是我正在谈论的内容的演示...正如您从日志中看到的那样,toggle 永远不会被调用:
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>
component.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,将“后”代码放入fixture.whenStable() 和fixture.whenRenderingDone()。
我在TestBed 的import 中有一个NoopAnimationsModule。
【问题讨论】:
-
useDefault是什么?是来自mat-slide-toggle的东西吗?是您创建的指令吗? -
好的,我更新了我的问题代码。
useDefault只是一个错字,它应该是[checked]="useDefault"。但是,我稍微修改了您的组件以更符合我所拥有的,即从useDefault = true开始。我只添加了一些日志记录语句。现在,由于我无法理解的原因,toggle日志不再显示:stackblitz.com/edit/… -
尝试直接触发更改事件:
componentDebug.query(By.css('mat-slide-toggle')).nativeElement.dispatchEvent(new Event('change'));您可能还必须模拟 MatSlideToggleChange 对象。