期望在函数内的 class 实例上调用方法

Expect method to be called on class instance within function

您好,我正在尝试断言已在文件实例化的 class 实例上调用函数。这里我有一个文件,它创建了 class Usecase 的一个新实例,然后有一个函数调用这个实例的方法。我正在测试这个文件,我想断言它已经调用了 class 实例上的方法。到目前为止,我已经在下面编写了我尝试的简化设置。然而,它表明 usecase.submitTaxes 尽管被调用了,但从未被调用过(我什至用日志语句来确认)。

我怀疑 index.test.ts 中的 usecaseindex.ts 中的 usecase 是不同的实例化,因此我不能断言该方法已被调用,因为技术上index.test.ts 中的 usecase 尚未调用。但是我不明白如何获得一个句柄,以便我可以在我正在测试的文件中创建的实例上编写期望行?

通常我会使用依赖注入来解决这个问题,但我不能在这里使用依赖注入,因为这是加载的第一个文件(它是一个 Lambda)。

没有 DI 可能无法做到这一点,但如果有人对解决方案有任何想法,我们将不胜感激。

//usecase.ts
export default class Usecase {
  async submitTaxes(): Promise<void> {
    await dependency.x();
  }
}

// index.ts
import Usecase from "usecase";

const usecase =  new Usecase(...);

export const handler = async (event) => {
  await usecase.submitTaxes();
}

// index.test.ts
import { handler } from "../../../src/index";
jest.mock("../../../src/usecase");

describe("Test", () => {
  let usecase: Usecase;
  beforeAll(() => {
   usecase = new Usecase(...); // will this be the same mock that index.ts uses?
  });
  
  it("Test", async () => {
    // GIVEN
    const event = ...;

    // WHEN
    await handler(event);

    // THEN
    expect(usecase.submitTaxes).toHaveBeenCalled(); // fails with no calls
  });
});

will this be the same mock that index.ts uses? - 不,它是 Usecase 的不同实例被嘲笑 class。

尝试获取在 index.js 文件中创建的模拟实例。参考 link.

import { handler } from './index'; // update this path
import Usecase from './usecase'; // // update this path
import { mocked } from 'ts-jest/utils';

jest.mock('./usecase'); // update this path

describe('Test', () => {
  let usecase: jest.Mocked<Usecase>;

  beforeAll(() => {
    // get the mocked instance
    usecase = mocked(Usecase).mock.instances[0] as jest.Mocked<Usecase>;
  });

  it('Test', async () => {
    // GIVEN
    const event = {};

    // WHEN
    await handler(event);

    // THEN
    expect(usecase.submitTaxes).toHaveBeenCalled();
  });
});