javascript - Hur man mockar en worker för ett Jest-test?


Jag har ett test:

import { convertHeicToPng } from './heicUtils';

class Worker {
  url: string;
  onmessage: (m?: any) => void;
  constructor(stringUrl: string) {
    this.url = stringUrl;
    this.onmessage = () => {};
  }

  postMessage(msg: any) {
    this.onmessage(msg);
  }
}

(window.Worker as any) = Worker;

describe('test heicUtils', () => {
  test('should convert HEIC to PNG', async () => {
    const file = new File([''], 'test.heic', { type: 'image/heic' });
    const base64 = await convertHeicToPng(file);
    expect(base64).toContain('data:image/png;base64');
  });
});

och i heicUtils använder jag heic2any, som använder WebWorkers. Hur kan jag på ett korrekt sätt mocka en Worker för ett Jest-test?

Svar #1

om du använder typescript kan det fungera att lägga till denna kod i din jest-setupfil:

type MessageHandler = (msg: string) => void;

class Worker {
    url: string;
    onmessage: MessageHandler;
    constructor(stringUrl: string) {
        this.url = stringUrl;
        this.onmessage = noop;
    }
    postMessage(msg: string): void {
        this.onmessage(msg);
    }
}

Object.defineProperty(window, 'Worker', {
    writable: true,
    value: Worker
});

Svar #2

Eftersom du testar din heicUtils-modul bör du mocka heic2any-biblioteket, annars kommer du att testa tredjepartsbiblioteket istället för din egen kod.

I mocken bör du definiera funktionerna/metoderna för heic2any som din heicUtils använder och vad de ska returnera för varje testfall du tänker skriva.

Exempel på hur man kan mocka moduler finns här: https://jestjs.io/docs/manual-mocks

Relaterade artiklar