1.0.3 • Published 3 years ago

react-mock-element v1.0.3

Weekly downloads
2
License
MIT
Repository
github
Last release
3 years ago

React mockElement

Mock element for capturing props in tests. Provides a middle-ground towards enzyme's shallow unit tests when using react-testing-library (but can be used with any testing library which renders to a DOM).

The intended use is to mock out specific children of a component under test which have important properties or are otherwise difficult to mock. This should not be used to mock every child component.

Install dependency

npm install --save-dev react-mock-element

Usage with react-testing-library + Jest

// code under test (MyComponent.jsx)

import React from 'react';

export default ({Child}) => {
  return (
    <div>
      foobar
      <Child p1="a" />
    </div>
  );
};


// test (MyComponent.test.jsx)

import React from 'react';
import {render, cleanup} from 'react-testing-library';
import mockElement from 'react-mock-element';
import MyComponent from './MyComponent';

describe('MyComponent', () => {
  it('creates a child element with a property', () => {
    const MyMockElement = mockElement('some-tag-name');

    const {container} = render(<MyComponent Child={MyMockElement} />);

    const child = container.querySelector('some-tag-name');
    expect(child.mockProps.p1).toEqual('a');
  });
});

afterEach(cleanup);

This is also compatible with Jest module mocking:

// code under test (MyComponent.jsx)

import React from 'react';
import ChildComponent from './ChildComponent';

export default () => {
  return (
    <div>
      foobar
      <ChildComponent p1="a" />
    </div>
  );
};


// test (MyComponent.test.jsx)

import React from 'react';
import {render, cleanup} from 'react-testing-library';
import mockElement from 'react-mock-element';
import MyComponent from './MyComponent';

jest.mock('./ChildComponent', () => mockElement('mock-child'));

describe('MyComponent', () => {
  it('creates a ChildComponent element with a property', () => {
    const {container} = render(<MyComponent />);

    const child = container.querySelector('mock-child');
    expect(child.mockProps.p1).toEqual('a');
  });
});

afterEach(cleanup);

API

mockElement(tagName): returns a React component which renders a tag with the given tag name (a naming convention such as mock-something is recommended but not required). Note that as this function name begins with mock, it can be used by hoisted jest.mock calls in tests (see second demo above).

element.mockProps: added to the HTMLElement prototype. This provides access to the props passed to an element. This is read-only.