首页 > 解决方案 > 在 jasmine 中调用 http get 并没有超时

问题描述

我在嘲笑我http.get,但我的测试仍然超时。

错误:超时 - 异步函数未在 5000 毫秒内完成(由 jasmine.DEFAULT_TIMEOUT_INTERVAL 设置)

我已经做了我能想到和读到的一切。done方法,我HttpClientTestingModule已经尝试flushexpectOne结果,但无济于事。

在控制台中,我看到了“testee.res”结果,但没有看到“tester.result”。


被试:

@Injectable({
  providedIn: 'root'
})
export class MetadataService {

  constructor(
    private http: HttpClient,
  ) { }


  public myMethod(): Observable<string> {
    const res = this.http.get<string>('myurl');
    
    console.log('testee.res',res);
    return res;
  }
}

测试人员:

describe('MetadataService', () => {
  let service: MetadataService;
  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientModule,
        HttpClientTestingModule,
      ],
      providers: [
        {
          provide: HttpClientTestingModule,
        },
      ]
    });
    service = TestBed.inject(MetadataService);
  });

  it('should call http get', (done) => {
    const http = TestBed.inject(HttpTestingController);

    //  Act.
    service.myMethod().subscribe(result => {
      console.log('tester:result',result);
      
      //  Assert.
      http.expectOne('myurl');
      done();
    });
  });
});

标签: typescripttestingjasmine

解决方案


HttpClientModule应该被删除。它没有改变测试结果;但这让我想知道在被测者身上注射了什么HttpClient。我之所以拥有它,是因为在早期的测试中,由于我不知道的原因需要它。

删除done(). 我知道不再需要了,但我不知道为什么保留它会保留超时错误。我相信(d)它只是为 Jasmine 设置一个标志来检查测试是否完成。正如我donesubscribe块中调用的那样,应该设置标志。但我想它比这更复杂。
有人知道吗?

必须在通话expectOne后移到外面。 原因是在被调用之前不返回任何东西。在内部调用使块永远不会运行,因为没有返回。因此超时。subscribe
http.gethttp.expectOneexpectOnesubscribesubscribeget

describe('MetadataService', () => {
  let service: MetadataService;
  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule,
      ],
      providers: [
        {
          provide: HttpClientTestingModule,
        },
      ]
    });
    service = TestBed.inject(MetadataService);
  });

  it('should call http get', () => {
    const http = TestBed.inject(HttpTestingController);

    //  Act.
    service.myMethod().subscribe(result => {
      console.log('tester:result',result);
    });

    //  Assert.
    http.expectOne('myurl');
  });
});

推荐阅读