跨测试更改 Jest 模拟实现

时间:2021-07-27 08:11:18

标签: node.js typescript jestjs

我正在尝试更改获取 subscribe 回调的第三方 processEvents 函数的模拟实现。 subscribe 函数的实现在不同的测试中发生变化,因为 processEvents 接收一个参数(事件列表),该参数根据测试场景而变化,因此也会导致不同的 Jest 期望。

模块:setup.ts(此模块设置挂钩等)

// This is a mock setup factory function
export const EventHubConsumerFactory = (subscribeFn: (...args: any) => any) => {
  const mockedModule = {
    ...jest.requireActual("@azure/event-hubs"),
    EventHubConsumerClient: jest.fn().mockImplementation(() => ({
      close: jest.fn(),
      subscribe: jest.fn().mockImplementation(subscribeFn),
    })),
  };

  jest.doMock("@azure/event-hubs", () => mockedModule);
};

模块:event-hub-consumer.ts(这个类有一个调用doSubscribe函数并传递subscribe回调的processEvents函数)

  doSubscribe() {
    this.subscription = this.consumerClient.subscribe(
      {
        processEvents: async (events) => { // do something such as write to db }
      }
    )};
  }

模块:test.ts(这里是一个示例测试。这个模块也有一堆导入)

  it("runs some test....", (done) => {
    // write some test case setup code
    const subscribeFn = ({ processEvents }: any) => {
      processEvents(eventHubEvents)
        .then(async () => {
          // evaluate expectations with data saved to db
          done();
        })
        .catch((err: Error) => done(err));
    };

    jest.isolateModules(() => {
      EventHubConsumerFactory(subscribeFn);
      const { EventHubConsumer } = require("../event-hub-consumer");
      new EventHubConsumer(eventHubConsumerParams).subscribe();
    });
  });

我读到 isolateModules 本地化模块注册表缓存。但是,这似乎不起作用。我的理解是测试在回调 processEvents 完成执行之前退出。

0 个答案:

没有答案