使用匹配器
Jest 使用“匹配器”让你使用不同方式测试数值。匹配器数量众多,这里仅列举最常用的。
普通匹配器
最简单的方式是判断是否相等。
test('two plus two is four', () => {
expect(2 + 2).toBe(4)
})
上面代码中,expect(2 + 2)
返回一个 expectation
对象。通常,只需对它执行匹配器即可。.toBe(4)
就是匹配器。当 Jest 执行时,它会追踪所有失败的匹配器,因此就可以打印出可读性很好的报错信息。
toBe
使用 Object.is
判断是否全等。如果你想判断对象的数值是否相等,可以使用 toEqual
:
test('object assignment', () => {
const data = { one: 1 }
data['two'] = 2
exepct(data).toEqual({ one: 1, two: 2 })
})
toEqual
会递归的检测对象或数组的每个字段。
你还可以检测匹配器的反义词:
test('adding positive numbers is not zero', () => {
for (let a = 1; a < 10; a++) {
for (let b = 1; b < 10; b++) {
expect(a + b).not.toBe(0)
}
}
})
真值测试
在某些测试中,需要区分 null
, undefined
, false
,有时却不需要。Jest 有辅助函数,帮你明确自己的需求:
toBeNull
只匹配null
toBeUndefined
只匹配undefined
toBeDefined
是toBeUndefined
反义词toBeTruthy
匹配任何if
语句当作真值的表达式toBeFalsy
匹配任何if
语句当作假值的表达式
比如:
test('null', () => {
const n = null
expect(n).toBeNull()
expect(n).toBeDefined()
expect(n).not.toBeUndefined()
expect(n).not.toBeTruthy()
expect(n).toBeFalsy()
})
test('zero', () => {
const z = 0
expect(z).not.toBeNull()
expect(z).toBeDefined()
expect(z).not.toBeUndefined()
expect(z).not.toBeTruthy()
expect(z).toBeFalsy()
})
应该使用最贴合代码场景的匹配器。
数字
大部分的数字比较功能都有对应的匹配器
test('two plus two', () => {
const value = 2 + 2
expect(value).toBeGreaterThan(3)
expect(value).toBeGreaterThanOrEqual(3.5)
expect(value).toBeLessThan(5)
expect(value).toBeLessThanOrEqual(4.5)
// toBe or toEqual are equivalent for numbers
expect(value).toBe(4)
expect(value).toEqual(4)
})
若要匹配浮点数相等,需要使用 toBeCloseTo
代替 toEqual
,防止浮点数的微小误差导致的错误。
test('adding floating point numbers', () => {
const value = 0.1 + 0.2
// expect(value).toBe(0.3)
expect(value).toBeCloseTo(0.3)
})
字符串
可用 toMatch
对字符串进行正则匹配:
test('there is no I in the team', () => {
expect('team').not.toMatch(/I/)
})
test('but there is a "stop" in Christoph', () => {
expect('Christoph').toMatch(/stop/)
})
数组
可以使用 toContain
判断数组是否包含某一元素:
const shoppingList = [
'diapers',
'kleenx',
'trash bags',
'paper towels',
'beer'
]
test('the shopping list has beer on it', () => {
expect(shopplingList).toContain('beer')
})
❓ 貌似
toContain
只可检测数值类型,无法检测引用类型?
异常
如果想检测某一函数调用时是否抛出异常,使用 toThrow
匹配器:
function compileAndroidCode() {
throw new ConfigError('you are using the wrong JDK')
}
test('compiling android goes as expected', () => {
expect(compileAndroidCode).toThrow()
expect(compileAndroidCode).toThrow(ConfigError)
// 还可以使用报错文本或正则表达式
expect(compileAndroidCode).toThrow('you are using the wrong JDK')
expect(compileAndroidCode).toThrow(/JDK/)
})
本小节内容只是开胃菜,若要了解全部匹配器,请查看参考文档。
一旦掌握了匹配器,下一步就是学习如何使用 Jest 测试异步代码。