在 Jest 中,循环输入和预期输出数组的最佳方法是什么?

Syn*_*nia 4 testing automated-tests unit-testing jestjs

如果我想为一个将东西加在一起的计算器编写一个测试。我可能会这样定义我的测试:

const tests = [
    {
      input: [1, 2],
      expected: 3,
    },
    {
      input: [2, 1],
      expected: 3,
    },
    {
      input: [3, 4],
      expected: 7,
    },
    {
      input: [2, 10],
      expected: 12,
    },
    {
      input: [2, 5],
      expected: 7,
    },
    ...
]

  tests.forEach((t) => {
    expect(add(t.input)).toEqual(t.expected)
  })
Run Code Online (Sandbox Code Playgroud)

问题是,如果其中一项测试失败,错误只会显示:

    Expected: "7"
    Received: "10"

      216 |   tests.forEach((t) => {
    > 217 |     expect(add(t.input)).toEqual(t.expected)
          |                                        ^
      218 |   })
Run Code Online (Sandbox Code Playgroud)

由此看来,我分不清是3+4算错了,还是2+5算错了。

另一种方法是不使用数组,而是将每个数组定义为自己的测试。然而,这需要更多的代码,并且您需要将expect语句复制粘贴到各处。

那么,测试复杂的计算函数(需要传递许多不同的输入排列以确保其正常工作)的最佳方法是什么?

Ten*_*eff 13

您可以使用 jest 的test.each将它们定义为单独的测试用例:

test.each(tests)('add %j', ({ input, expected }) => {
  expect(add(input)).toEqual(expected)
})
Run Code Online (Sandbox Code Playgroud)

但更好的是,您可以定义tests如下以利用 printf 格式:

const tests = [
  [[1,2], 3],
  [[2,1],3],
  [[3,4],7],
  [[2,10],12],
  [[2,5],7]
]

test.each(tests)('add(%j) should equal %d', (input, expected) => {
  expect(add(input)).toEqual(expected)
})
Run Code Online (Sandbox Code Playgroud)

工作示例