Angular 为什么使用'fakeAsync'测试不能使测试代码以异步方式运行?

Angular 为什么使用'fakeAsync'测试不能使测试代码以异步方式运行?,angular,Angular,根据文件 使用ObservablefakeAsync和tick()应该允许测试异步实体。 我创建了一个测试,在我看来,它是文档中呈现的代码的对应物(没有组件)。不幸的是,它失败了。你能解释一下原因吗 it('how to test observables. Example #5', fakeAsync(() => { let progress = true; // of(['somevalemiitter']) //without asapScheduler, it w

根据文件

使用
Observable
fakeAsync
tick()
应该允许测试异步实体。 我创建了一个测试,在我看来,它是文档中呈现的代码的对应物(没有组件)。不幸的是,它失败了。你能解释一下原因吗

  it('how to test observables. Example #5', fakeAsync(() => {
    let progress = true;
    // of(['somevalemiitter']) //without asapScheduler, it will fail
    throwError('bleblebl') //without asapScheduler, it will fail
      .pipe(finalize(() => {
        progress = false;
        // done();
      }))
      .subscribe(console.log, err => console.log(err));
    expect(progress).toBeTruthy();
    console.log('before tick');
    tick();
    console.log('after tick');
    expect(progress).toBeFalsy();
  }));
产出

'bleblebl'
'before tick'
'after tick'
我希望它在哪里

'before tick'
'bleblebl'
'after tick'

只是因为使用了
fakeAsync
。如果我使用
asapScheduler
,那么它将按预期工作。

这似乎是
投递者的指定行为,订阅是同步处理的-因此您的测试或
fakeAsync
没有问题

例如,在角度分量中的这种方法:

handleClick() {
  throwError("test").subscribe(console.log, console.log);
  console.log("test2");
}
这导致:

test  
test2

这似乎是
throwError
的指定行为,订阅是同步处理的-因此测试或
fakeAsync
没有问题

例如,在角度分量中的这种方法:

handleClick() {
  throwError("test").subscribe(console.log, console.log);
  console.log("test2");
}
这导致:

test  
test2

throwError和of函数是同步的,因此在您的示例中,一切都是正确的。如果您想模拟异步行为,请使用asyncScheduler。但是,如果所有问题都已解决,为什么首先使用
勾选
勾选
模拟时间的流逝,但是如果您没有异步操作(微任务和宏任务)
勾选
对dothrower没有任何作用,函数的执行也是同步的,所以在你的例子中,一切都是正确的。如果要模拟异步行为,请使用asyncScheduler。但是,如果所有问题都已解决,为什么首先要使用
勾选
勾选
模拟时间的流逝,但如果没有异步操作(微任务和宏任务)
tick
不影响代码中的
tick
点(取自文档)如果您有异步操作(例如间隔或api调用),tick将模拟调度程序中的时间传递,以便您可以在异步操作完成后检查post条件。tick还可以与数字一起使用,这意味着它将模拟给定ms的传递,例如tick(1000)。因此,在示例中,使用文档中的示例,i misslinding就是misslinding(至少对我而言),在该示例中,组件有一个setTimeout(其行为是异步的):
setTimeout(()=>this.errorMessage=err.message | err.toString())因此,他们使用勾号来确保超时被计算。啊,我实际上跳过了这一部分,如果你有一个异步操作(例如间隔或api调用),那么代码中的
勾号
有什么意义(它取自文档),tick将模拟调度程序中的时间传递,以便在异步操作完成后检查post条件。tick还可以与数字一起使用,这意味着它将模拟给定ms的传递,例如tick(1000)。因此,在示例中,使用文档中的示例,i misslinding就是misslinding(至少对我而言),在该示例中,组件有一个setTimeout(其行为是异步的):
setTimeout(()=>this.errorMessage=err.message | err.toString())因此他们使用勾号来确保超时被计算。啊,我实际上跳过了那部分,