Package Exports
- jest-mock-proxy
- jest-mock-proxy/lib/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (jest-mock-proxy) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
jest-mock-proxy
Mock classes and objects with the power of proxies!
Creates a Proxy
that will dynamically create spies when a property is accessed the first time.
Every subsequent access will use the same spy. In combination with TypeScript this allows us to create a mock for any class/object without having to specify all its properties and methods.
tl;dr;
- The
Proxy
makes any property and method available on the mock at runtime. - TypeScript limits access to properties and methods to the specified generic.
Install
Requires node 8+.
$ yarn add -D jest-mock-proxy
or
$ npm install -D jest-mock-proxy
Usage
Mock objects and instances
// service.ts
export class Service {
foo() {
console.log('hello');
}
bar(s: string) {
return s;
}
}
// some.test.ts
import { createMockProxy } from 'jest-mock-proxy';
import { service } from './service';
const mock = createMockProxy<typeof Service>();
mock.foo();
mock.bar.mockReturnValue('some string');
mock.bar('test'); // 'some string'
Example: Mock an elastic search client.
import { Client } from 'elasticsearch';
import { createMockProxy } from 'jest-mock-proxy';
import fixture from './__fixtures__/elastic-response.json';
// This is an imaginary service that depends on the elastic search client.
import createService from './createService';
const client = createMockProxy<Client>();
const service = createService(client);
beforeEach(() => {
client.mockClear();
client.search.mockResolvedValue(fixture);
});
test('use service to query', async () => {
await service.query('https://example.com?q=hello');
expect(client.search.mock.calls).toMatchSnapshot();
});
Mock a class and use jest's automock
When you need to mock a dependency via jest.mock
, because you have no access to the module.
// query.ts
import { Pool, PoolConfig } from 'pg';
// 😨 This makes testing hard...
const pool = new Pool();
export const query = async (q: string, values?: any[]) => {
// ...because how to mock this?
const { rows } = pool.query(q, values);
return rows;
};
// query.test.ts
import { Pool } from 'pg';
import { createProxyFromMock } from 'jest-mock-proxy';
import { query } from './query';
jest.mock('pg');
const mockedPool = createProxyFromMock(Pool);
test('you can now mock the pool.query', async () => {
// Use mockedPool so you get good type inference from TS
mockedPool.query.mockResolvedValue({ rows: [{ id: 1, data: 'data' }] });
await query('SELECT * FROM table1'); // returns `[{ id: 1, data: 'data' }]`
});