I have a component like this:
JavaScript
x
8
1
export const DetailsItem: FC = (): ReactElement => {
2
const { isInEditMode } = useAppSelector(({ editMode }) => editMode);
3
if (isInEditMode) {
4
return <DetailsItemEdit />;
5
}
6
return <DetailsItemDisplay />;
7
};
8
and am trying to test it.
JavaScript
1
12
12
1
describe('DetailsItem', () => {
2
it('should render DetailsItemDisplay component', () => {
3
render(
4
<Provider store={}> // I want to pass isInEditMode here.
5
<DetailsItem />
6
</Provider>,
7
);
8
9
screen.debug();
10
});
11
});
12
The problem is, I somehow need to mock the store, to match my case. Any ideas how I should handle this?
I remember in my previous project I used a npm package to do this, but can’t find it now, and can’t remember how I did it, or what it was called
Advertisement
Answer
you can create a helper function for your tests to abstract the setup of the store/dependencies:
JavaScript
1
12
12
1
// import dependencies here:
2
3
function createTestWithStore(stateFromTest, component) {
4
let reducer = { reducerA, reducerB };
5
let preloadedState = merge(initialState, stateFromTest);
6
let store = configureStore({
7
reducer,
8
preloadedState
9
})
10
return <Provider store={store}>{component}</Provider>
11
}
12
and use it in your tests:
JavaScript
1
14
14
1
describe('DetailsItem', () => {
2
it('should render DetailsItemDisplay component with a single item', () => {
3
let testState = { list: [{ id: 1, name: "John" }] };
4
render(createTestWithStore(testState, <DetailsItem />));
5
screen.debug();
6
});
7
8
it('should render DetailsItemDisplay component no item', () => {
9
let testState = { list: [] };
10
render(createTestWithStore(testState, <DetailsItem />));
11
screen.debug();
12
});
13
});
14
have a look in the “Writing Tests” page from Redux, it is part of the “Recommended practices for testing apps using Redux”: https://redux.js.org/usage/writing-tests#connected-components