Mock require with Jest

I needed to mock a call to require that was used to parse a JSON file and return the data. The require was only called if a value wasn’t provided as a parameter and it needed to load a default from disk, so I needed to mock both the require and the return data. You can achieve this with jest using both a stub and a mock

// This is the function that we'll inspect later to make sure it was called
const eventPathFn = jest.fn(() => {
  return { action: "labeled" }
})

// Mock the call to require('/path/to/file.json')
// We specify virtual:true as it's not a real module being mocked
const spy = jest.mock("/path/to/file.json", eventPathFn, {
  virtual: true,
})

// Run your code here that calls require('/path/to/file.json')
doSomething()

// Expect the mock that we provided as module.exports
// to have been called
expect(eventPathFn).toBeCalled()

I use this for mocking process.env.GITHUB_EVENT_PATH when testing my GitHub Actions, meaning that I can keep event fixture data in the test even though the underlying library expects a file on disk