describe('My work', () => {
test('works', () => {
expect(2).toEqual(2);
});
});
- describe: Group related tests.
- test or it: Define individual test cases.
- expect: Make assertions.
๐ it() is an alias for test().
Jest is a JavaScript testing framework designed by Facebook. It works out of the box with modern JavaScript apps especially those built with React or Node.js. Its main goal is to simplify testing by providing all required features in one package test runner, assertion library, mocking, spies, coverage reports, and snapshot testing.
describe(): Used to group related test cases into a test suite.test() / it(): Define a single test case. it() is just a BDD-style alias for test().expect(): Assertion library that checks whether a value meets expectations.beforeEach() / afterEach(): Runs code before or after every test in a suite.beforeAll() / afterAll(): Runs setup/teardown code once before or after all tests..only / .skip: Focus or ignore specific tests/suites.setTimeout() and setInterval().async/await.npm install --save-dev jest babel-jest
Add this to your package.json:
"scripts": {
"test": "jest"
}
Run your tests:
npm test -- --watch
๐ See: Getting Started
describe('My work', () => {
test('works', () => {
expect(2).toEqual(2);
});
});
๐ it() is an alias for test().
Use these for setup/teardown routines:
beforeEach(() => { ... });
afterEach(() => { ... });
beforeAll(() => { ... });
afterAll(() => { ... });
Focusing tests:
describe.only(...);
it.only(...); // or fit()
Skipping tests:
describe.skip(...);
it.skip(...); // or xit()
| Flag | Description |
|---|---|
--coverage | Show test coverage summary |
--detectOpenHandles | Detect unclosed handles (e.g., sockets) |
--runInBand | Run tests serially (useful for CI) |
expect(value).not.toBe(value);
expect(value).toEqual(value);
expect(value).toBeTruthy();
Note:
toEqualperforms deep equality.
expect(value).toMatchSnapshot();
expect(value).toMatchInlineSnapshot();
Inline snapshots require Prettier.
expect(fn).toThrow(error);
expect(fn).toThrowErrorMatchingSnapshot();
expect(value).toBeFalsy();
expect(value).toBeNull();
expect(value).toBeTruthy();
expect(value).toBeUndefined();
expect(value).toBeDefined();
expect(value).toBeCloseTo(number, digits);
expect(value).toBeGreaterThan(number);
expect(value).toBeLessThanOrEqual(number);
expect(value).toBeInstanceOf(Class);
expect(value).toMatchObject(obj);
expect(value).toHaveProperty('key', value);
expect(value).toContain(item);
expect(value).toHaveLength(number);
expect(value).toMatch(/pattern/);
expect.extend(customMatchers);
expect.any(Constructor);
expect.assertions(1);
test('resolves correctly', () => {
return somePromise().then(data => {
expect(data).toEqual(...);
});
});
test('awaits correctly', async () => {
const result = await asyncFunc();
expect(result).toBe(...);
});
๐ See: Jest Async Testing
it('renders correctly', () => {
const output = something();
expect(output).toMatchSnapshot();
});
For React components:
import renderer from 'react-test-renderer';
it('matches snapshot', () => {
const tree = renderer.create(<Component />).toJSON();
expect(tree).toMatchSnapshot();
});
jest.useFakeTimers();
it('delays call', () => {
jest.runOnlyPendingTimers();
jest.runAllTimers();
});
๐ See: Timer Mocks
const fn = jest.fn();
const squared = jest.fn((n) => n * n);
expect(fn).toHaveBeenCalled();
expect(fn).toHaveBeenCalledTimes(2);
expect(fn).toHaveBeenCalledWith(arg1, arg2);
expect(fn).toHaveBeenCalledWith(expect.any(String));
expect(fn).toHaveBeenCalledWith(expect.arrayContaining([1, 2]));
const MyClass = jest.fn();
const a = new MyClass();
const b = new MyClass();
MyClass.mock.instances; // [a, b]
fn.mock.calls.length;
fn.mock.calls[0][0];
jest.fn().mockReturnValue('hello');
jest.fn().mockReturnValueOnce('hi');
const fn = jest
.fn()
.mockImplementationOnce(() => 1)
.mockImplementationOnce(() => 2);
This comprehensive guide helps you get started with Jest testing or use it like a pro. It pairs perfectly with the React Testing Library for a user-centric testing workflow.