给定一个与此类似的测试用例:
test(“test”, () => {
[1, 2, ..., 1000000].map(value => {
expect(() => foo(value)).toThrow();
});
})
是否有一种简单的方法来设置断点(例如在第 3 行),该断点仅在 expect 语句失败时触发?
换句话说,如果大数组中间某处的某个值导致测试失败,而大多数值不会触发异常条件,是否有某种方法可以设置断点如果测试通过则跳过但如果测试失败则中断?
这将使找出该值的测试失败的原因变得容易得多。
我正在使用 WebStorm,因此我对如何使用 Chrome/node、代码或 WebStorm 进行操作的答案感到满意。
最佳答案
如果您在编译时知道这些值,那么您可以使用 test.each
为每个值创建独特的测试,让您清楚地看到哪个值失败了:
const tests = [[6], [7], [8]];
test.each(tests)(
'%i should be even',
v => {
expect(v % 2).toBe(0);
}
)
...报告两个测试通过(6 和 8)并在 7 上失败并带有描述性消息:
● 7 should be even
expect(received).toBe(expected) // Object.is equality
Expected: 0
Received: 1
4 | '%i should be even',
5 | v => {
> 6 | expect(v % 2).toBe(0);
| ^
7 | }
8 | )
at toBe (src/code.test.js:6:19)
如果测试数据直到运行时才可用并且断言很简单,那么您可以在 expect
行上设置一个条件断点:
const generateData = count => {
const data = [];
for (let i = 0; i < count; i++) {
data.push(Math.floor(Math.random() * 10) + 1);
}
return data;
}
test('all values are even', () => {
generateData(1000).map(v => {
expect(v % 2).toBe(0); // <= set breakpoint for v % 2 !== 0
});
})
如果测试数据直到运行时才可用,并且很难设置条件断点,那么您可以将 expect
包装在 try/catch
中并放置catch
中的断点:
const generateData = count => {
const data = [];
for (let i = 0; i < count; i++) {
data.push(Math.floor(Math.random() * 10) + 1);
}
return data;
}
test('all values are even', () => {
generateData(1000).map(v => {
try {
expect(v % 2).toBe(0);
}
catch (err) {
throw err; // <= set your breakpoint here
}
});
})
如果断言失败,expect
语句通过抛出一个 Error
来工作,所以这种方法简单地捕获并重新抛出 Error
但给你一个设置断点的地方,该断点将因失败的 expect
而被触发。
关于javascript - 使用Jest,如何只在测试用例失败时才触发断点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57796432/