Is there a jest config that will fail tests on con

2020-08-10 07:10发布

How do I configure jest tests to fail on warnings?

console.warn('stuff');
// fail test

标签: jestjs
4条回答
仙女界的扛把子
2楼-- · 2020-08-10 07:41

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

查看更多
闹够了就滚
3楼-- · 2020-08-10 07:46

I decided to post a full example based on user1823021 answer

describe('#perform', () => {
  var api
  // the global.fetch is set to jest.fn() object globally
  global.fetch = jest.fn()
  var warn = jest.spyOn(global.console, 'warn');
  beforeEach(function() {
    // before every test, all mocks need to be resetted
    api = new Api()
    global.fetch.mockReset()
    warn.mockReset()
  });

  it('triggers an console.warn if fetch fails', function() {
    // In this test fetch mock throws an error
    global.fetch.mockImplementationOnce(() => {
      throw 'error triggered'
    })
    // I run the test
    api.perform()
    // I verify that the warn spy has been triggered
    expect(warn).toHaveBeenCalledTimes(1);
    expect(warn).toBeCalledWith("api call failed with error: ", "error triggered")
  });

  it('calls fetch function', function() {
    // I create 2 more mock objects to verify the fetch parameters
    const url = jest.fn()
    const config = jest.fn()
    api.url = url
    api.config = config
    // I run the test
    api.perform()
    // I verify that fetch has been called with url and config mocks
    expect(global.fetch).toHaveBeenCalledTimes(1)
    expect(global.fetch).toBeCalledWith(url, config)
    expect(warn).toHaveBeenCalledTimes(0)
  });
})

the #perform method I am testing

class Api {
  constructor(auth) {
    this._credentials = auth
  }

  perform = async () => {
    try {
      return await fetch(this.url, this.config)
    } catch(error) {
      console.warn('api call failed with error: ', error)
    }
  }
}
查看更多
女痞
4楼-- · 2020-08-10 07:51

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();
  });
});
查看更多
Anthone
5楼-- · 2020-08-10 07:51

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

查看更多
登录 后发表回答