JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 4125
  • Score
    100M100P100Q126641F
  • License MIT

Mock classes and objects with the power of proxies!

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

buid buid version MIT License

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;

  1. The Proxy makes any property and method available on the mock at runtime.
  2. 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' }]`
});