Tuesday, 3 January 2023

How can I mock a class using jest?

How can I mock something to test something like the following codes. I tried to follow this official doc, but still not working for me https://jestjs.io/docs/es6-class-mocks#calling-jestmock-with-the-module-factory-parameter

// somefile.ts

export const myPublish = async (event: any, context: any): Promise<any> => {
  const myExportHelper = await ExportHelper.getInstance({
    ...commonProps,
  });

  // just some other stuff
  // just some other stuff

  await myExportHelper.transfer(arg1, arg2);
};

export class ExportHelper {
  constructor(
    private readonly bucket: string,
    private readonly read: AWS.S3,
    private readonly write: AWS.S3
  ) {}

  static async getInstance(props: {
    param1: string;
  }) {
    ...
    ...

    return new ExportHelper(arg1, arg2, arg3);
  };

  async transfer(param1, param2) {
    ...
    ...
    console.log('bla bla bla');
  }
}

// testfile.test.ts

import { myPublish, ExportHelper } from '../somefile';

beforeEach(() => {
});

afterEach(() => {
    jest.clearAllMocks();
    jest.resetAllMocks();
});

describe('myTest', () => {
    it('should run successfully', async () => {
        // Arrange
        const eventMock = {
            Records: [
                {
                    ...
                }
            ]
        }

        jest.mock('../somefile');
        const mockActualExportHelper = jest.requireActual('../somefile').ExportHelper;
        
        const mockGetInstanceImpl = () => {};

        // this says cannot read property instances of undefined
        const mockExportHelper = mockActualExportHelper.mock.instances[0]; 
        mockExportHelper.getInstance.mockImplementation(mockGetInstanceImpl);
        mockExportHelper.transfer.mockImplementation(mockGetInstanceImpl);

        // Act
        await myPublish(eventMock, jasmine.any({}));

        // Assert
        expect(ExportHelper.getInstance).toBeCalled();
        expect(ExportHelper.transfer).toBeCalled(); // also not sure if this is valid to use ExportHelper
        
    });
});


from How can I mock a class using jest?

No comments:

Post a Comment