Is there a jest config that will fail tests on console.warn?

You can use this simple override :

let error = console.error

console.error = function (message) {
  error.apply(console, arguments) // keep default behaviour
  throw (message instanceof Error ? message : new Error(message))
}

You can make it available across all tests using Jest setupFiles.

In package.json :

"jest": {
    "setupFiles": [
      "./tests/jest.overrides.js"
    ]
}

Then put the snippet into jest.overrides.js


I implemented this recently using jest.spyOn introduced in v19.0.0 to mock the warn method of console (which is accesses via the global context / object).

Can then expect that the mocked warn was not called, as shown below.

describe('A function that does something', () => {
  it('Should not trigger a warning', () => {
    var warn = jest.spyOn(global.console, 'warn');

    // Do something that may trigger warning via `console.warn`
    doSomething();

    // ... i.e.
    console.warn('stuff');

    // Check that warn was not called (fail on warning)
    expect(warn).not.toHaveBeenCalled();

    // Cleanup
    warn.mockReset();
    warn.mockRestore();
  });
});

For those using create-react-app, not wanting to run npm run eject, you can add the following code to ./src/setupTests.js:

global.console.warn = (message) => {
  throw message
}

global.console.error = (message) => {
  throw message
}

Now, jest will fail when messages are passed to console.warn or console.error.

create-react-app Docs - Initializing Test Environment