I'm just getting set up with Jest and I've successfully written unit tests that test the DOM. I have a library that types things on the screen, so I'm able to test just fine. In some cases, instead of throwing an error, my library will spit out a console.warn
or console.log
. Is it possible to use Jest to test that these console messages are happening?
Jest uses jsdom to provide an environment that behaves much like a browser's DOM or document. Each test file gets a single instance of jsdom, and changes aren't reset between tests inside the file. It's a best practice to clean up between tests so that a test's output doesn't affect any other test.
Jest by default prints all console. log (warnings, errors, etc) messages to the console. That's great - it helps you understand what's going on in your code when tests run.
Jest actually ships with jsdom and the environment already configured. You can override it with the testEnvironment setting. If you need to set up more aspects of the environment though, you can use the setupTestFrameworkScriptFile setting to point to a file that executes before all of your tests run.
By default, jest uses the node testEnvironment. This essentially makes any tests meant for a browser environment invalid. jsdom is an implementation of a browser environment, which supports these types of UI tests.
You can set console.log to by a spy like this:
global.console = {
warn: jest.fn(),
log: jest.fn()
}
// run your code
expect(global.console.log).toHaveBeenCalledWith('test')
As your test file runs in a separate thread you don't need to reset console
to the original methods
Suppose you want test a function like this by printing a message:
function sayHello () { console.log('Hello!') }
You can use jest.spyOn
function to change how console.log
function behaves.
function sayHello () { console.log('Hello!') };
describe('logging "Hello"', () => {
const log = jest.spyOn(global.console, 'log');
sayHello();
it('should print to console', () => {
expect(log).toHaveBeenCalledWith('Hello!');
});
});
OR you can redefine console
object and add a key with jest.fn
value, like this:
describe('sayHello prints "Hello!"', () => {
const log = jest.fn()
global.console = { log }
sayHello()
expect(log).toHaveBeenCalledWith('Hello!')
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With