您可以使用expect.extend() 来做到这一点。如果您使用的是create-react-app,则可以将此示例代码放在下面的setupTests.ts 中,以便将其应用于您运行的所有测试:
expect.extend({
toBeWithinRange(received, min, max) {
const pass = received >= min && received <= ceiling
return {
message: () =>
`expected ${received} to be in range ${floor} - ${ceiling}`,
pass,
}
},
})
用法
it('should fail', () => {
expect(13).toBeWithinRange(1, 10)
})
运行上面的测试时,输出如下:
但我们可以做得更好。看看内置的匹配器是如何显示错误信息的:
如您所见,错误更容易阅读,因为 expected 和 received 值具有不同的颜色,并且上面有一个匹配器提示来指示哪个是哪个。
为此,我们需要安装这个包jest-matcher-utils 并导入几个方法来漂亮地打印匹配器提示和值:
import { printExpected, printReceived, matcherHint } from "jest-matcher-utils"
const failMessage = (received, min, max) => () => `${matcherHint(
".toBeWithinRange",
"received",
"min, max"
)}
Expected value to be in range:
min: ${printExpected(min)}
max: ${printExpected(max)}
Received: ${printReceived(received)}`
expect.extend({
toBeWithinRange(received, min, max) {
const pass = received >= min && received <= max
return {
pass,
message: failMessage(received, min, max),
}
},
})
现在看起来好多了,可以帮助您更快地发现问题
然而,当你否定断言时,上面的代码中有一个小错误
expect(3).not.toBeWithinRange(1, 10)
输出是.toBeWithinRange 而不是.not.toBeWithinRange:
expect(received).toBeWithinRange(min, max)
Expected value to be in range:
min: 1
max: 10
Received: 3
要解决这个问题,您可以根据pass 值有条件地添加否定词
const failMessage = (received, min, max, not) => () => `${matcherHint(
`${not ? ".not" : ""}.toBeWithinRange`,
"received",
"min, max"
)}
Expected value${not ? " not " : " "}to be in range:
min: ${printExpected(min)}
max: ${printExpected(max)}
Received: ${printReceived(received)}`
toBeWithinRange(received, min, max) {
const pass = received >= min && received <= max
return {
pass,
message: failMessage(received, min, max, pass),
}
},
现在重新运行测试,你会看到:
如果false则通过
expect(3).not.toBeWithinRange(1, 10)
expect(received).not.toBeWithinRange(min, max)
Expected value not to be in range:
min: 1
max: 10
Received: 3
如果true则通过
expect(13).toBeWithinRange(1, 10)
expect(received).toBeWithinRange(min, max)
Expected value to be in range:
min: 1
max: 10
Received: 13