Package Exports
- redux-test-recorder
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 (redux-test-recorder) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Redux Test Recorder
NOTE EXPERIMENTAL, API MAY CHANGE DRAMATICALLY NOTE YOUR STATE TREE MUST BE SERIALIZABLE
Redux test recorder is a redux middleware + included component for automagically generating tests for your reducers based on the actions in your app.
Click here for a demo. And here for another demo with TodoMVC
Also take a look at our latest build which currently runs a test generated using this module by taking advantage of the eval
command. For a better idea of what is going on, you can take a look at the test file here.

Install
npm install redux-test-recorder --save-dev
Use
First set up your store utilizing the exported middleware from redux-test-recorder
. Export the props included with redux-test-recorder
at this time as well.
import reduxRecord from 'redux-test-recorder';
const reducer = (state = initState, { type, payload }) => {
let newState;
switch (type) {
case 'INCREMENT':
newState = state + 1;
break;
case 'DECREMENT':
newState = state - 1;
break;
default:
newState = state;
}
return newState;
}
const record = reduxRecord({reducer});
export const store = createStoreWithMiddleware(reducer, applyMiddleware(record.middleware));
export const recordProps = record.props;
Then at the component level include redux-test-recorder
at the root.
import {store, recordProps } from './store';
import { TestRecorder } from 'redux-test-recorder';
const Counter = ({count, dispatch}) => {
return (
<div>
<button onClick={() => dispatch(increment())}>+</button>
<h1>{count}</h1>
<button onClick={() => dispatch(decrement())}>-</button>
</div>
);
}
const ConnectedCounter = connect(state => {
return {count: state};
})(Counter);
const Root = () => {
return (
<div>
<Provider store={store}>
<div><ConnectedCounter /><TestRecorder {...recordProps} /></div>
</Provider>
</div>;
};
This will allow you to generate tests on your reducer with a record button in the bottom right corner.
Args
reducer
- the root reducer of your redux app, used in the generated test.includeReducer
- a boolean value, if true, a stringified version of your reducer will be incuded in your generated test, if false, a note to import reducer for testing will be added. defaults to false. Useful when used to generate actual tests so you can test updated functionality.stateKey(*optional*)
- if instead of recording the whole state you only want to record a specific piece, pass that here (useful withactionSubset
prop explained next).actionSubset(*optional*)
- allows you to record against a subset of actions instead of all actions. Useful combined withstateKey
to test a single reducer.equality(*optional*)
- a function used to determine if the reducer returned correct state. Receives result of the reducer call and nextState returned during the flow of the application (note, this api is in flux). deafults to===
. This argument can also be a string. This is useful if you want to call a function you will include in your test file, since calling external functions will not properly stringify that external function.imports(*optional*)
- a string argument where you can pass in other modules that you would like included iny our test file. Useful if you want to reference external functions in your equality check.testLib(*optional*)
- defaults totape
. Currently supportstape
,ava
, andmocha
. You can also optionally supply a function to this argument to generate your own tests. Will receivestate, actions, imports, reducer, equalityFunction
as arguments and expects return type to be a string containing your test contents.numTestsToSave(*optional, defaults to 5)
- number of previous tests that will be accessible in the panel when tests are being displayed. Higher number = newer.
Create Your Own Testing Interface
If you're not satisfied with the built in testing interface or would like to experiment with something different, it's relatively straightforward. The return of the exported function is an object with two keys middleware
and props
. The middleware
key contains, well, the middleware, props
contains information for accessing the current state of the tests. These include getRecordingStatus
, a function to inform you if you are currently recording,startRecord
, stopRecord
, which are functions that start and stop test recording. getTest
which returns the current generated test, shouldShowTest
which returns true after you have started then stopped test recording and lastly hideTest
which is likely less useful when creating your own testing interface, but this basically resets all of the other values to their initial value. You can take a look here for what this looks like for the tape implementation.