😜 mocking gatsby image

In my quest for 100% test coverage, I've had to mock some gatsby internals to get tests to run in isolation. Since the release of Gatsby v3, I had to take into account the new gatsby-plugin-image.

In order to mock the plugin, I essentially copied the original plugin and then overwrote the GatsbyImage and StaticImage components with a function. The function creates a simple React component that renders a vanilla <img> tag. This allows me to run assertions in jest tests like I would expect.

jest.mock("gatsby-plugin-image", () => {
    const React = require("react")
    const plugin = jest.requireActual("gatsby-plugin-image")

    const mockImage = ({imgClassName, ...props}) =>
        React.createElement("img", {
            ...props,
            className: imgClassName,
        })

    const mockPlugin = {
        ...plugin,
        GatsbyImage: jest.fn().mockImplementation(mockImage),
        StaticImage: jest.fn().mockImplementation(mockImage),
    }

    return mockPlugin
})

You can place this code snippet in your jest setup file like I did. While this mock doesn't cover all of the functionality of gatsby-plugin-image, it certainly handles the features that I use in my daily development.

Feel free to give this mock a try, and if there's enough interest I can package this up and release it on npm.