【问题标题】:Is it possible to use ts-jest / jest to spy on a generic function and mock a return value in Typescript environment?是否可以使用 ts-jest / jest 监视通用函数并在 Typescript 环境中模拟返回值?
【发布时间】:2020-03-31 16:10:31
【问题描述】:

我是新用户,尝试通过 ts-jest 在 Typescript 环境中学习 jest。我希望“spyOn”的功能之一使用泛型。是否可以监视通用函数并模拟类型化的返回值?

例如:

export class Api {
  private api: AxiosInstance;

  constructor(api: AxiosInstance = axios) {
    this.api = api;
  }

  public all<T, From = T, TF extends ITransform<From, T> = never>(
    url: string,
    transformer?: TF,
  ): Observable<AxiosResponse<T[]>> {
    return this.requestAll<T, From, TF>(url, transformer);
  }

我试过了:

const allSpy = jest.spyOn<Api, 'all'>(Api.prototype, 'all');

在这种情况下,allSpy 具有以下类型信息:

const allSpy: jest.SpyInstance<Observable<AxiosResponse<unknown[]>>, [string, (ITransform<any, any> | undefined)?]>

如果我尝试模拟返回值,则会收到类型编译错误:

 const response: AxiosResponse<MyObj[]> = {
      data: [
        { id: 1014760, objName: 'Object 1' },
        { id: 1015762, objName: 'Object 2' },
      ],
      status: 200,
      statusText: 'ok',
      headers: {},
      config: {},
    };
allSpy.mockReturnValueOnce(response); // type error for response

【问题讨论】:

  • 您正在监视返回值的可观察值但返回值的东西。 TS 告诉你正确的事情;这是不正确的。
  • 那么我怎样才能窥探 all 方法呢?
  • 已经在监视它。关键是你必须返回正确的东西,这就是错误来的地方:.mockReturnValueOnce(of(response))
  • 非常感谢,@jonrsharpe,明白了,模拟了一个可观察的响应。你想发布答案,我会接受吗?

标签: typescript jestjs ts-jest


【解决方案1】:

尝试用 stub 代替 spy,你就能得到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    相关资源
    最近更新 更多