首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在nest HttpService上用jest测试HttpService

如何在nest HttpService上用jest测试HttpService
EN

Stack Overflow用户
提问于 2021-06-03 21:04:20
回答 1查看 778关注 0票数 0

在我的NestJS项目中有以下方法:

代码语言:javascript
复制
getAccessToken(): Observable < string > {
  return this.httpService.post(`${url}/oauth2/token`, params).pipe(
    retryWhen((errors) =>
      errors.pipe(
        delay(1000),
        take(5),
        (e) =>
          concat(
            e,
            throwError(
              `Error retrieving access token. Tried 5 times.`
            )
          )
      )
    ),
    catchError((err) => {
      this.loggerService.error(err);
      throw err;
    }),
    map((res) => res.data),
    map((data) => data.access_token)
  );
}

上面的代码将调用API。如果成功,它将返回access_token,如果失败,它将尝试最多5次,如果在5次之后不成功,它将抛出异常。

现在我想写三个单元测试,

当API不抛出错误并返回访问令牌

时,

  • 成功

  1. 6次失败

  1. 失败2次,并返回访问令牌

试验1:

代码语言:javascript
复制
it('should return access_token', async () => {
  const response: AxiosResponse = {
    data: {
      access_token: 'token1'
    },
    status: 200,
    statusText: 'OK',
    headers: {},
    config: {}
  };

  const post = jest
    .spyOn(httpService, 'post')
    .mockImplementationOnce(() => of(response));

  try {
    const token = await service.getAccessToken().toPromise();
    expect(token).toBe('token1');
  } catch (err) {
    expect(true).toBeFalsy();
  }
});

试验2:

代码语言:javascript
复制
it('should retry and fails', async () => {
  const err: AxiosError = {
    config: {},
    code: '500',
    name: '',
    message: '',
    response: {
      data: {},
      status: 500,
      statusText: '',
      headers: {},
      config: {}
    },
    isAxiosError: true,
    toJSON: () => null
  };

  const post = jest
    .spyOn(httpService, 'post')
    .mockImplementationOnce(() => throwError(err));

  try {
    await service.getAccessToken().toPromise();
    expect(true).toBeFalsy();
  } catch (err) {
    expect(err).toBe(
      'Error retrieving access token. Tried 5 times.'
    );
  }
});

然而,我不知道如何写第三次考试。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-04 14:05:24

我找到了解决办法,以防别人有同样的问题。

代码语言:javascript
复制
    it('should retry and return access token', async () => {
        const response: AxiosResponse = {
            data: {
                access_token: 'token1'
            },
            status: 200,
            statusText: 'OK',
            headers: {},
            config: {}
        };

        const err: AxiosError = {
            config: {},
            code: '500',
            name: '',
            message: '',
            response: {
                data: {},
                status: 500,
                statusText: '',
                headers: {},
                config: {}
            },
            isAxiosError: true,
            toJSON: () => null
        };

        let retried = 0;

        const post = jest
            .spyOn(httpService, 'post')
            .mockImplementationOnce(() => {
                return new Observable((s) => {
                    if (retried <= 1) {
                        retried += 1;
                        s.error(err);
                    } else {
                        s.next(response);
                        s.complete()
                    }
                });
            });

        try {
            const token = await service.getAccessToken().toPromise();
            expect(token).toBe('token1');
        } catch (err) {
            expect(true).toBeFalsy();
        }

        expect(post).toHaveBeenCalled();
        expect(post).toHaveBeenCalledTimes(1);
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67828659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档