By default, your React app likely has an App.test.js file which I moved and renamed to __tests__/App.js. Now I was pretty bad and didn't write any test cases for a while, and went on developing without running this test... So, when I finally ran Jest tests using the command
npm testI found my test was failing! The first cause of failure was that when I rendered my App on index.js I had actually surrounded it in a <BrowserRouter> tag, which meant that when <App> was rendered on its own, it was missing the <BrowserRouter> surrounding the <Switch> and <Route>s. So this test actually allowed me to refactor my code into a more readable and sensible structure... And that was just the basic included test!
But my test was still failing! The error was:
TypeError: window.matchMedia is not a functionThe cause of this is that Jest uses JSDom to create a browser environment, which doesn't support window.matchMedia, and I was using this in my code. After some googling, it turns out that it could be mocked out. So I created a __mocks__/matchMedia.js file with the following contents:
window.matchMedia = jest.fn().mockImplementation(query => { return { matches: false, media: query, onchange: null, addListener: jest.fn(), removeListener: jest.fn(), }; });In my __tests__/App.js file I imported this mock and low and behold a different error! This error was about having a store, I used the "redux-mock-store" npm package to mock out my redux store and wrapping my <App> in a <Provider>, and my __tests__/App.js file ended up looking like this:
import React from 'react'; import ReactDOM from 'react-dom'; import '../__mocks__/matchMedia'; import { Provider } from 'react-redux'; import configureMockStore from 'redux-mock-store'; import App from '../App'; const mockStore = configureMockStore(); const store = mockStore({}); describe('App', () => { it('renders without crashing', () => { const div = document.createElement('div'); ReactDOM.render(( <Provider store={store}> <App /> </Provider> ), div); }); });And guess what... It PASSED!
No comments:
Post a Comment