Automatically generate prop fixtures and snapshot tests for your React components
import snap from 'jest-auto-snapshots';
import MyComponent from '../MyComponent';
snap(MyComponent, '../MyComponent.jsx');
↓
PASS examples/MyComponent/__tests__/MyComponent.test.js
jest-auto-snapshots > MyComponent
✓ Matches snapshot when passed only required props (3ms)
✓ Matches snapshot when passed all props (2ms)
✓ Matches snapshot when boolean prop "booleanProp" is set to: "false" (1ms)
Why?
Snapshot tests are a very useful tool whenever you want to make sure your UI does not change unexpectedly.
jest
and enzyme-to-json
are fantastic tools, but writing tests for all the different possible rendering states and maintaining props is tedious.
Really, we just want to know when & where a component snapshot changes and if that change was intentional.
What this script does (or aspires to do):
- Save time when writing simple A -> B rendering tests.
- Automatically update, add, and remove snapshot tests when component props change.
- Ensure that all possible component rendering states are covered.
What it doesn't do:
- Deeply test all prop possibilities nested in
arrays
or shapes
. This would just create way to many snapshots and should be handled manually (or, better yet, strive to make your component props as flat as possible). I'm open to a settings option to allow for this in future iterations, though. - Test functionality for you. You should still write manual tests for things like button clicks, component state changes, etc.
- Save time running tests. It's only supposed to save time writing tests.
How
- Finds and parses your component's source
.jsx
file with react-docgen. - Parses your
Component.propTypes
tree and checks for different conditions (required vs optional props, boolean props, etc). - Generates fixtures and tests based on the data above.
Setup
Important: This module requires jest, enzyme, and enzyme-to-json to be correctly configured and working in your project. jest-auto-snapshots
is supplemental to these tools and does not provide them for you.
Install
npm i jest-auto-snapshots --save-dev
or yarn add jest-auto-snapshots --dev
Example
MyComponent.jsx
const MyComponent = ({ stringProp, booleanProp, nodeProp }) => (
<div>
{booleanProp && <span>Hello</span>}
{stringProp}
{nodeProp}
</div>
);
MyComponent.propTypes = {
booleanProp: PropTypes.bool,
stringProp: PropTypes.string,
nodeProp: PropTypes.node,
};
MyComponent.test.js
import snap from 'jest-auto-snapshots';
import MyComponent from '../MyComponent';
snap(MyComponent, '../MyComponent.jsx');
MyComponent.test.js.snap
(generated from the example code above)
exports[`when boolean prop "booleanProp" is set to: "false" 1`] = `
<div>
jest-auto-snapshots String Fixture
<NodeFixture />
</div>
`;
exports[`when passed all props 1`] = `
<div>
<span>
Hello
</span>
jest-auto-snapshots String Fixture
<NodeFixture />
</div>
`;
exports[`when passed only required props 1`] = `
<div>
jest-auto-snapshots String Fixture
</div>
`;
More Examples
For more examples highlighting different use cases, please check out the examples directory
API
snap(
component: <Component:required>,
componentFilePath: <String:required>,
config: <Object:optional>,
);
Config
There are 2 ways to change configuration for the script. Either at the root level in your jest setup file or in each individual test. The params are the same for both:
Key | Description | Defaults |
---|
fixturesByPropKey | Inject component prop fixtures bassed on the prop key | None |
fixturesByPropType | Inject component prop fixtures based on the prop type | see src/configure.js. By default it covers all the core propTypes. |
Set Config at the Root Level
In your jest setup file:
const jestAutoSnapshots = require('jest-auto-snapshots');
jestAutoSnapshots.configure({
fixturesByPropType: {
customPropType: 'custom fixture',
},
fixturesByPropKey: {
user: { name: 'Joe', age: 30 },
},
});
For the above example:
'custom fixture'
will be injected for all components with something: customPropType
in their propTypes
object.{name: 'Joe', age: 30}
will be injected for all components with user: PropTypes.shape({ /* ... */ })
in their propTypes
object.
Set Config at the Test Level
In your test file:
import snap from 'jest-auto-snapshots';
import CustomProps from '../CustomProps';
snap(CustomProps, '../CustomProps.jsx', {
fixturesByPropType: {
customPropType: 'custom fixture',
},
fixturesByPropKey: {
user: { name: 'Joe', age: 30 },
},
});
For the above example, these custom fixtures will only be injected for the current test.