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
