simplest-react-lazy
v0.0.10
Published
Alternative to React.lazy with able to full coverage testing in Jest
Downloads
1
Readme
Simplest React.lazy alternative
...with able to fully coverage testing in Jest
Why?
There are currently difficulties/problems with testing React Suspense/lazy in jest and enzyme.
This package provides alternative with almost same API and testing util.
Install
# by npm
npm install --save simplest-react-lazy
# or yarn
yarn add simplest-react-lazy
Usage
component.jsx
import React from 'react';
const Component = () => (
<div>It is just a component...</div>
);
export default Component;
lazy-component.jsx
import { lazy } from 'simplest-react-lazy';
export const LazyComponent = lazy(() => import('./component'));
index.jsx
import React, { useState } from 'react';
import { LazyComponent } from './lazy-component.jsx';
export const App = () => {
const [show, toggleShow] = useState(false);
return (
<div>
<h1>Test App</h1>
<p>simplest-react-lazy example</p>
<button onClick={() => toggleShow(!show)}>
Show lazy component
</button>
{show && (
<LazyComponent fallback='Loading...' /> // no Suspense needed
)}
</div>
);
};
Jest testing example
First of all setup jest
// in your jest setup file
import { mockLazy } from 'simplest-react-lazy/test-utils';
// ...other setup...
jest.mock('simplest-react-lazy', () => {
const original = jest.requireActual('simplest-react-lazy');
return {
...original,
lazy: mockLazy(original.lazy),
};
});
Write test with special util
import React from 'react';
import { act } from 'react-dom/test-utils';
import { mount } from 'enzyme';
import { importLazy } from 'simplest-react-lazy/test-utils';
// ...import components...
describe('<App />', () => {
test('should render lazy component', async () => {
const wrapper = mount(<App />);
expect(wrapper.find(Component)).toHaveLength(0);
act(() => {
wrapper.find('button').simulate('click');
});
wrapper.update();
expect(wrapper.find(Component)).toHaveLength(0);
// await import of module for lazy component
await act(async () => {
await importLazy(LazyComponent);
});
// update enzyme wrapper is required
wrapper.update();
expect(wrapper.find(Component)).toHaveLength(1);
});
});
To Do
- ~remove
lodash/fp/prop
~ - ~show warning when resolveComponent returns non valid React type~