Typescript 期望 mockImplementation 为所有方法和属性提供模拟

w.b*_*ian 7 typescript jestjs ts-jest

我正在使用 typescript + jest,并且在创建模拟实现时遇到了一些类型检查问题。作为一个例子,我想模拟Credentials以下对象aws-sdk

import { Credentials } from "aws-sdk";

jest.mock("aws-sdk");

const CredentialsMock = mocked(Credentials);

describe("Foo test", () => {
  beforeAll(() => {
    CredentialsMock.mockImplementation(() => { /*** <--- Type checking fails here ***/
      return {
        get: jest.fn()
      }
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当Credentials我只想模拟单个方法时,类型检查器希望我为该类型的每个方法/属性提供模拟。具体错误是:

TS2345:类型参数 '() => { get: jest.Mock; }' 不可分配给类型为“(accessKeyId: string, SecretAccessKey: string, sessionToken?: string | undefined) => Credentials”的参数。

输入 '{ get: Mock; }' 缺少“Credentials”类型中的以下属性:getPromise、needsRefresh、refresh、refreshPromise 等 5 个属性。

有没有办法让打字稿在这里快乐?

Lev*_*lit 3

我发现,当提供参数或返回值与原始值不同的模拟实现时,让打字稿满意的一种方法是将模拟实例包装在类型断言中。假设mocked(Credentials)在您的示例中返回 a jest.MockInstance,类型断言将如下所示:

    (CredentialsMock as jest.MockInstance<any, any>).mockImplementation(() => {
      return {
        get: jest.fn()
      }
    });
Run Code Online (Sandbox Code Playgroud)