测试使用Jest和Angular更新Subject的HTTP请求

avkwfej4  于 11个月前  发布在  Jest
关注(0)|答案(1)|浏览(181)

我试图了解如何测试observation$是否像_observations一样更新。

//This is the function I want to test
  public createNewOdour(odour: OdourCreateForm): Observable<ObservationRes> {
    return this.http
      .post<ObservationRes>(
        `${environment.BACKEND_BASE_URL}api/observations`,
        { ...odour },
        {
          headers: {
            'Content-Type': 'application/json',
            Accept: 'application/json',
          },
          withCredentials: true,
        },
      )
      .pipe(
        tap(({ data }) => {
          this.observation$.next(data[0]);
          const currObservations = this._observations.getValue();
          this.updateObservations([...currObservations, data[0]]);
        }),
      );
  }

个字符
我想检查observation$主题是否更新了HTTP响应。我希望res.data[0]observationValue相同,但什么也没发生。现在它等于null,测试仍然通过,当它不应该。
更新:
现在我订阅的服务主题,而不是嘲笑它。它的工作原理是,我订阅它之前调用的功能,更新它。任何更好的解决方案?

`  it('createNewOdour() updates the observation$ Subject', () => {
    httpMock.post.mockReturnValueOnce(
      of({ status: 'success', data: [observationsMock[0]] }),
    );

    // Check if observation$ have the expected value
    service.observation$.subscribe((observationValue) => {
      expect(observationValue.id).toEqual(observationsMock[0].id);
    });

    service.createNewOdour(odourCreateFormMock).subscribe();
  });`

zbq4xfa0

zbq4xfa01#

测试只是几行代码,但是订阅有点到处都是。在这样的测试设置中,订阅是否是异步的,或者Assert是否运行,通常并不明显。这就是为什么我不喜欢在测试中订阅,而是使用promise。而且在大多数情况下,它是一次性的,或者如果需要多个值,可以使用toArray()
所以我会这样写测试:

it('should update the observation$ subject', async () => {
  // [Mock setup here]

  const obs = service.createNewOdour(odourCreateFormMock)
    .pipe(switchMap(() => service.observation$));

  const result = await firstValueFrom(obs);

  expect(result.id).toEqual(observationsMock[0].id);
});

字符串
observation$应该是一个BehaviorSubject,这样订阅的时间就不重要了。

相关问题