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

Thoughts on this post

Leave a comment?