This question is really good: Jest Mock module per test
It just don't answer my question on how to only mock it out in one single test and keep the rest using the original component.
That would make sense if I wish to do some mocking for an snapshot but not for the other tests
This is my current attempt
import React from 'react'
import { render } from '@testing-library/react'
jest.mock('components/Photo', () =>
jest.fn(() => jest.requireActual('components/Photo'))
)
import Photo from 'components/Photo'
import PhotoGrid from '.'
beforeEach(() => {
Photo.mockReset()
})
test('default renders 9 photos if provided 9', () => {
const photos = [...Array(9).keys()]
const { getAllByTestId, debug } = render(<PhotoGrid photos={photos} />)
debug()
expect(getAllByTestId(PHOTO_COMP_TEST_ID)).toHaveLength(9)
})
test('renders with masonry grid style', () => {
Photo.mockImplementation(() => <div />)
const photos = [...Array(9).keys()]
const { container, debug } = render(<PhotoGrid photos={photos} />)
debug()
expect(container).toMatchInlineSnapshot(`
<div>
...
</div>
`)
})
This is the component to test
import React from 'react'
import Masonry from 'react-masonry-css'
import './index.css'
import Photo from 'components/Photo'
function PhotoGrid({ photos, numberOfPhotos = 9 }) {
const imgs = photos ? photos.slice(0, numberOfPhotos) : []
const breakpointColumnsObj = {
default: 4,
1300: 3,
900: 2,
700: 1,
}
return (
<Masonry
breakpointCols={breakpointColumnsObj}
className="my-masonry-grid"
columnClassName="my-masonry-grid_column"
>
{imgs &&
imgs.map(({ id, secret, server, farm }, index) => (
<div key={index} className="masonry-item">
<Photo id={id} secret={secret} server={server} farm={farm} />
</div>
))}
</Masonry>
)
}
export default PhotoGrid