为什么detectChanges()之后复选框选中的属性没有更改

时间:2019-11-12 12:14:34

标签: angular jasmine angular-test angular-testing

我尝试通过更改模型来更改复选框选中的属性,但是它不起作用。我无法理解这种行为。

模板

<input type="checkbox" [(ngModel)]="model"/>

测试代码

    it('should be checked after click on unchecked checkbox', () => {
        const checkbox: HTMLInputElement = fixture.nativeElement.querySelector('input');

        component.model = true;
        fixture.detectChanges();
        expect(checkbox.checked).toBeTruthy();
    });

完整代码:https://stackblitz.com/edit/angular-testing-checkbox?file=app/app.component.spec.ts

2 个答案:

答案 0 :(得分:1)

因为角度变化检测是异步的。您的expect()语句在更改检测完成之前发生。在测试中使用角度测试async()函数:

   it('should be checked after click on unchecked checkbox', async( () => {
        const checkbox: HTMLInputElement = fixture.nativeElement.querySelector('input');    
        component.model = true;
        fixture.detectChanges();    
        fixture.whenStable().then(()=> {
          expect(checkbox.checked).toBeTruthy();
        })   
    }));

答案 1 :(得分:1)

您可以将fixture.whenStabledone函数一起使用,以将异步更改检测周期与expect同步。

it('should be checked after click on unchecked checkbox', (done) => {
    const checkbox: HTMLInputElement = fixture.nativeElement.querySelector('input');

    component.model = true;
    fixture.detectChanges();
    fixture.whenStable().then(() => {
      expect(checkbox.checked).toBe(true);
      done();
    });
});