模拟函数时如何允许部分TypeScript类型-Jest,TypeScript

时间:2019-05-14 11:47:15

标签: typescript jestjs

我有一个函数,我想在TypeScript中模拟该函数以进行测试。在我的测试中,我只关心jsonstatus。但是,当使用Jest的jest.spyOn时,我的模拟函数的类型设置为返回http Response类型。这很尴尬,因为这意味着我必须手动去实现一堆无关紧要的函数和属性。

我怀疑这里有某种方法可以使用部分类型,以便通过将返回类型重写为我只关心的内容来更好,更有用的模拟。我将如何去做?

export function mockApi(json: object, status: number): void {
  jest.spyOn(
    myApiModule,
    'methodWhichReturnsAResponse'
  ).mockImplementation(() =>
    Promise.resolve({
      json: () => Promise.resolve(json),
      status,
      // Below here is to appease jest types (not needed for
      // testing purposes at the time of writing)
      headers: {
        has: (name: string) => true,
        // get, set, etc...
      },
      ok: true,
      redirected: false,
      // and about 10 other properties which exist on the Response type
      // ...
    }),
  );
}

2 个答案:

答案 0 :(得分:1)

可以使用as ...

export function mockApi(json: object, status: number): void {
  jest.spyOn(
    myApiModule,
    'methodWhichReturnsAResponse'
  ).mockImplementation(() =>
    Promise.resolve({
      json: () => Promise.resolve(json),
      status
    } as http.Response), // <-- here
  );
}

用于类型转换的as关键字用于将文字转换为X类型时,将仅允许您部分定义它,但是您仍需进行类型检查,因为您无法定义不支持的道具存在。

示例:

type X {
  a: number
  b: number
}

const x = { a: 2 } as X // OK
const y = { a: 3, c: 2 } as X // NOT OK, because c does not exist in X

答案 1 :(得分:0)

我找到了一种使用unknown类型的解决方案。

尝试并无法立即使用as进行类型转换后,我首先将诺言投射到unknown,然后将此值转换为所需的Response类型,如下所示:

    // ...
    .mockImplementation(() => {
      const httpResponsePromise = Promise.resolve({
        json: () => Promise.resolve(json),
        status,
      }) as unknown;
      return httpResponsePromise as Promise<Response>;
    });