当嵌套ngModel元素

时间:2016-12-22 00:19:10

标签: angular testing

我很清楚这个错误:

https://github.com/angular/angular/issues/10148

其中提到需要调用fixture.detectChanges();然后调用fixture.whenStable()

但是,当我开始嵌套每个使用ngModel值访问器提供程序的元素时,我必须在循环中调用这两个方法。

有不同的方法吗?它看起来并不高效,我不断需要编辑这个功能。我可以使用递归方法来简化这一点,以防止重复,但这不是问题。

export function bugWhenStable(fixture: ComponentFixture<any>): Promise<any> {
    let def = new Promise(resolver => {
        fixture.detectChanges();
        fixture.whenStable().then(() => {
            fixture.detectChanges();
            fixture.whenStable().then(() => {
                fixture.detectChanges();
                fixture.whenStable().then(() => {
                    resolver();
                });
            });
        });
    });

    return def;
}

我的组件做了这样的事情:

<wm-comp1 [(ngModel)]="value"></wm-comp1>

我在Comp1中有哪些

<wm-comp2 [(ngModel)]="value"></wm-comp2>

2 个答案:

答案 0 :(得分:1)

你试过将承诺退还给下一个fn吗?这将makeit等待它解决。我在我的规格中尝试了一次并且工作得很好。看起来更干净。

export function bugWhenStable(fixture: ComponentFixture<any>): Promise<any> {
  let def = new Promise(resolver => {
    fixture.detectChanges();
    fixture.whenStable()
      .then(() => {
        fixture.detectChanges();

        return fixture.whenStable();
      }).then(() => {
        fixture.detectChanges();

        return fixture.whenStable()
      }).then(() => {
        resolver();
      });
  });

  return def;
}

也有些人这样做,但我从未尝试过。

export function bugWhenStable(fixture: ComponentFixture<any>): Promise<any> {
  let def = new Promise(resolver => {
    fixture.detectChanges();
    tick();
    fixture.detectChanges();
    tick();
    fixture.detectChanges();
    tick();
    resolver();
  });
});

return def;
}

答案 1 :(得分:1)

为什么不使用async/await

it('should do whatever', async(async() => {
  fixture.detectChanges();
  await fixture.whenStable();
}));
相关问题