角2 MockBackend测试HTTP超时?(angular 2 MockBackend test

2019-09-28 07:40发布

有没有一种方法来测试服务的HTTP超时行为?

作业的超时时间设置为0,没有“超时”目前的记录时,我使用MockBackend均匀。

export class MyHttpService {
private sendGetRequest (job: HttpJob): Observable<any> {
    return this.http.get(job.getUrl(), this.options)
      .share()
      .timeout(job.getTimeout(), () => this.requestTimeout(job))
      .catch((err) => this.errorHandler(err, job));
  };

  private requestTimeout(job: HttpJob): Error {
    job.errorCode = ErrorCode.TIMEOUT;
    console.log('TIMEOUT');
    return new Error('timeout');
  }
...

测试(没有登录)

 it('should resolve to TIMEOUT', () => {
      job.timeout = 0;
      let response: any;
      service.sendRequest(job).subscribe(
        (res: Response) => {
          response = res.json();
          console.log('OK', res);
        },
        err => {
          response = err;
          console.log('ER', err);
        }
      );
      expect(job.errorCode).toEqual(ErrorCode.TIMEOUT);
    });

谢谢!

更新 : 小例子 ,如果超时是注释掉,它会失败

Answer 1:

这是因为分辨率subscribe方法是异步的。 您正在尝试同步测试。

it('..', () => {
  doSomthing().subscribe(() => {

  })
  expect(something)
})

在这里,他的预期由之前的认购触发任何异步任务同步发生。 而在测试完成同步甚至在异步任务完成(这就是为什么你永远也看不到的console.log)

你需要做的是要么使用async和做预期的订阅回调

import { async } from '@angular/core/testing'

it('..', async(() => {
  doSomthing().subscribe(() => {
    expect(something)
  })
}))

或者使用fakeAsync ,并通过调用强制假同步分辨率tick

import { fakeAsync, tick } from '@angular/core/testing'

it('..', fakeAsync(() => {
  doSomthing().subscribe(() => {
    // this is called when you tick
  })
  tick();
  expect(something);
}))


文章来源: angular 2 MockBackend test http timeout?