jest 笔记

jest官网
jest demo

安装

1
npm install jest -g

Matchers(匹配)

  • toBe (基本数据类型相等)
1
2
3
test('two plus two is four', () => {
expect(2 + 2).toBe(4);
});
  • toEqual (引用数据相等)
1
2
3
test('Object assign', () => {
expect(Object.assign({ a: 1 }, { a: 2 })).toEqual({ a: 2 });
});
  • not (取反)
  • Truthiness(真假判断)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
test('null', () => {
const n = null;
expect(n).toBeNull(); // null
expect(n).toBeDefined(); // 不是 undefined
expect(n).not.toBeUndefined(); // 不匹配 undefined
expect(n).not.toBeTruthy(); // 不是 真
expect(n).toBeFalsy(); // 假
});

test('zero', () => {
const z = 0;
expect(z).not.toBeNull(); // 不是 null
expect(z).toBeDefined(); // 不是 undefined
expect(z).not.toBeUndefined(); // 不是 不是 undefined
expect(z).not.toBeTruthy(); // 不是 真
expect(z).toBeFalsy(); // 是假
});
  • 数字比较
1
2
3
4
5
6
7
8
9
10
test('two plus two', () => {
const value = 2 + 2;
expect(value).toBeGreaterThan(3); // 比3大
expect(value).toBeGreaterThanOrEqual(3.5); // 大于等于
expect(value).toBeLessThan(5); // 小于
expect(value).toBeLessThanOrEqual(4.5); // 小于等于

expect(value).toBe(4); // 相等
expect(value).toEqual(4); // 相等
});
  • 字符串比较
1
2
3
test('there is no I in team', () => {
expect('team').not.toMatch(/I/); // 包含
});
  • 数组比较
1
2
3
4
5
6
7
8
9
10
11
12
const shoppingList = [
'diapers',
'kleenex',
'trash bags',
'paper towels',
'beer',
];

test('the shopping list has beer on it', () => {
expect(shoppingList).toContain('beer'); // 包含
expect(new Set(shoppingList)).toContain('beer'); // 包含
});
  • toThrow (指定函数抛出错误)
1
2
3
4
5
6
7
8
9
10
11
12
function compileAndroidCode() {
throw new ConfigError('you are using the wrong JDK');
}

test('compiling android goes as expected', () => {
expect(compileAndroidCode).toThrow();
expect(compileAndroidCode).toThrow(ConfigError);

// You can also use the exact error message or a regexp
expect(compileAndroidCode).toThrow('you are using the wrong JDK');
expect(compileAndroidCode).toThrow(/JDK/);
});
  • 测试异步函数(callback、promise、async)
1
2
3
4
5
6
7
8
9
10
11
12
function fetchData() {
return Math.random() > 0.5 ? Promise.resolve(1234) : Promise.reject('error')
}

test('the data is peanut butter', () => {
expect.assertions(1) // 只会触发一次断言
return fetchData()
.then(data => {
expect(data).toBeDefined();
})
.catch(e => expect(e).toMatch(/err/))
});
  • Setup and Teardown(测试执行顺序)

    1
    2
    3
    4
    5
    beforeAll
    beforeEach
    test
    afterEach
    afterAll
  • describe(作用域)

Mock 函数

  • Mock Functions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function forEach(items, callback) {
for (let index = 0; index < items.length; index++) {
callback(items[index]);
}
}

const mockCallback = jest.fn(x => 42 + x);
forEach([0, 1], mockCallback);

// mock函数被触发两次
expect(mockCallback.mock.calls.length).toBe(2);

// 第一次第一个参数是0
expect(mockCallback.mock.calls[0][0]).toBe(0);

// 第二次第一个参数是1
expect(mockCallback.mock.calls[1][0]).toBe(1);

// 第一个次返回的结果42
expect(mockCallback.mock.results[0].value).toBe(42);
  • Mock 的返回值
1
2
3
4
5
6
7
8
9
10
11
const myMock = jest.fn();
console.log(myMock());
// > undefined

myMock
.mockReturnValueOnce(10)
.mockReturnValueOnce('x')
.mockReturnValue(true);

console.log(myMock(), myMock(), myMock(), myMock());
// > 10, 'x', true, true

更多