返回

Jest 如何优雅地暴露复杂判断条件中的具体问题

前端

想象一下这样的场景:你正在编写一个 JavaScript 函数的测试用例,该函数接收一个复杂的对象作为输入,并根据对象的某些属性做出决策。要测试此函数的正确性,你必须验证它在各种输入情况下是否做出正确的决定。

然而,问题出现了。你的测试用例失败了,但你却不知道具体是哪个属性值导致了失败。你逐个检查每个属性,但似乎一切都正确无误。

这就是 Jest 出场的时刻。Jest 提供了一个强大的功能,可以帮助你揭示复杂判断条件中隐藏的问题:expect.assertions()

什么是 expect.assertions()

expect.assertions() 是一种断言,它允许你指定你期望在测试中进行的断言数量。它通过检查实际执行的断言数量与你预期的数量是否一致来工作。

如何使用 expect.assertions()

使用 expect.assertions() 非常简单。只需在测试用例的开头添加以下行:

expect.assertions(n);

其中 n 是你期望在测试中进行的断言数量。

例如,如果你预期对输入对象的三个属性进行断言,你可以这样编写测试用例:

expect.assertions(3);

// 对输入对象的属性进行断言

expect.assertions() 如何帮助解决问题?

现在,假设你的测试用例再次失败。这一次,你检查了 expect.assertions(),发现实际执行的断言数量与你预期的数量不一致。这意味着你的测试用例要么没有进行足够的断言,要么进行了不必要的断言。

通过检查你编写的断言,你可以快速找出导致测试失败的具体属性。这可以为你节省大量调试时间,并有助于你编写更全面、更可靠的测试用例。

一个实际示例

让我们用一个实际示例来说明 expect.assertions() 的作用。假设你有一个函数 calculateDiscount(),该函数根据输入对象的以下属性计算折扣:

  • customerType(字符串)
  • purchaseAmount(数字)
  • loyaltyPoints(数字)

你编写了一个测试用例来验证 calculateDiscount() 在以下输入情况下是否计算出正确的折扣:

const input = {
  customerType: 'regular',
  purchaseAmount: 100,
  loyaltyPoints: 10
};

const expectedDiscount = 10;

你的测试用例如下所示:

expect.assertions(1);

const actualDiscount = calculateDiscount(input);
expect(actualDiscount).toBe(expectedDiscount);

但是,当运行测试用例时,它失败了。通过检查 expect.assertions(),你发现只执行了一个断言,而不是预期的两个断言。这意味着你忘记了断言输入对象的另一个属性。

通过添加以下断言,你可以解决此问题:

expect(input.customerType).toBe('regular');

现在,当运行测试用例时,它会通过,因为所有三个断言都成功执行。

结论

expect.assertions() 是 Jest 中一个非常有用的工具,可以帮助你揭示复杂判断条件中隐藏的问题。通过指定你期望在测试中进行的断言数量,你可以轻松识别缺少或不必要的断言,从而节省调试时间并提高测试套件的可靠性。