React Higher Order Component using react-testing-library and Jest

Table of Contents

Recently I have had to test a React Higher Order Component using react-testing-library but struggled to find how you can achieve this.

Before I go any further into detail, below is some example code I have done so you can get straight to copy and pasting. For more information see below the code sample.

Show me the code

The Gist is here https://gist.github.com/johnnolan/1c8075a9124506d75953b540adf7a3bd.js

import React from 'react'
import {render, cleanup} from 'react-testing-library'

// withHOC.js
function withHOC (WrappedComponent) {
  render() {
    return (
      

HOC Example

) } } afterEach(cleanup) class MockApp extends React.Component { render () { return (

Hello from your Mock App

) } } const MockWithHOC = withHOC(MockApp) test('can render with redux with defaults', () => { const { container, getByText } = render( ) expect(getByText(/HOC Example/i)).toBeInTheDocument() expect(getByText(/Hello from your Mock App/i)).toBeInTheDocument() expect(container).toMatchSnapshot() })

What is going on?

As you can see from the above code we have an example and very basic High Order Component called withHOC. This creates a layout and generic H1 for us and then renders our WrappedComponent.

Using the render method directly passing this in won't work. We have to instead do a bit of setup.

On line 22 we create a, what I have called, Mock App with some basic html in it.

class MockApp extends React.Component {
  render () {
    return (
      

Hello from your Mock App

) } }

We will use this to be able to wrap our Higher Order Component around it. We do this on line 30.

const MockWithHOC = withHOC(MockApp)

This will now return us a React component we can pass into render.

const { container, getByText } = render()

And that's it, we can now start to use this as if it were any other component, plus test that the WrappedComponent renders correctly.

expect(getByText(/HOC Example/i)).toBeInTheDocument()
expect(getByText(/Hello from your Mock App/i)).toBeInTheDocument()