@giancosta86/worker-mock
v1.0.0
Published
Minimalist Worker mocks in TypeScript
Maintainers
Readme
worker-mock
Minimalist Worker mocks in TypeScript
worker-mock is a TypeScript library working in conjunction with worker-facade to easily test Worker logic.
Installation
The package on NPM is:
@giancosta86/worker-mock
which should most often be a dev dependency.
The public API entirely resides in the root package index, so one shouldn't reference specific modules.
worker-facade
Since the WorkerFacade interface should be referenced by clients in order to be able to plug WorkerMock when running tests, you'll most often want to add the worker-facade peer library as a non-dev dependency:
@giancosta86/worker-facade
Matchers
To use the matchers provided by this library, one needs to:
Add the following attribute to the object exported by
jest.config.js:setupFilesAfterEnv: ["@giancosta86/worker-mock/dist/all"],Add this line to a
global.d.tsfile within the project root directory:import "@giancosta86/worker-mock";Add
"./global.d.ts"to theincludearray intsconfig.json
Usage
Basics
After installing worker-facade as a non-dev dependency, you should:
Implement the body of the worker as a
RequestListener<TRequest, TResponse>- a function type provided byworker-facade:export const yourRequestListener: RequestListener<TRequest, TResponse> = ( request, sendResponse ) => { //Here, process the request and //call sendResponse() for each message //to be sent to the client };Please, note: this function must NOT reside in the worker script - but in a dedicated module instead.
In the worker script, just import
RequestListenerandyourRequestListener, then add the line:RequestListener.register(self, yourRequestListener);Every software component that needs to exchange messages with the worker should not depend on
Worker- but on theWorkerFacade<TRequest>interface, which includes just the subset of methods and events dedicated to message passing:function f(worker: WorkerFacade<TRequest>): void { //Do some stuff, then send a request, //which must be of type TRequest worker.postMessage({ alpha: 90, beta: 100 }); }In tests, the
Workerlogic can be plugged into clients by importingyourRequestListenerand wrapping it into aWorkerMock:WorkerMock.create(yourRequestListener);because
WorkerMockactually implementsWorkerFacade
Matchers
worker-mock also provides useful extensions to Jest's expect():
expect(eventListenerFunction).toHaveBeenCalledWithMessageEvents([array of message objects]):the argument of
expect()must be a mock function created viajest.fn()and registered via:workerFacade.addListener("message", eventListenerFunction);the argument of the matcher but be an array of message objects - that is, the
datafields of theMessageEventinstances actually received by the listener
Please, note: the arrays of actual and expected messages are compared according to deep structural equality - that is, by comparing their JSON strings, so as to support arbitrarily-nested message structures
expect(eventListenerFunction).toHaveBeenCalledWithErrorEvents([array of error message strings]):the argument of
expect()must be a mock function created viajest.fn()and registered via:workerFacade.addListener("error", eventListenerFunction);the argument of the matcher must be an array of error message strings - that is, the
messagefields of theErrorEventinstances actually received by the listener
Further references
- worker-facade - Message-passing TypeScript utilities for Worker
