使用jest测试.each与使用forEach循环

0s7z1bwu  于 2023-03-10  发布在  Jest
关注(0)|答案(3)|浏览(314)

有什么理由让我更喜欢其中一种方法吗?下面是一些例子:

describe('some tests', () => {
  [1, 2, 3].forEach(num => {
    test(`${num}: test`, () => {
      doSomeTestStuff(num)
    }) 
  })

  // vs.

  test.each([1, 2, 3])('%s: test', (num) => {
    doSomeTestStuff(num)
  })
})

test.each的语法似乎很难理解,尤其是当你可以通过原生javascript迭代来达到同样的效果时,Teardown/setup仍然以同样的方式发生(据我所知)。

6jygbczu

6jygbczu1#

问得好!
从表面上看,这两种方法基本上是等效的,但是您可能希望使用.each,这有几个原因。

  • 如果forEach中的一个期望失败了,它会立即失败并停止执行,这让你不知道forEach中的其他测试是通过还是失败,对于.each,它基本上是为数组中的每一项编写一个单独的和不同的测试。
  • 如果forEach中的一个期望失败,并不总是很明显是数组中的哪一项导致了失败,在.each中,您会自动从唯一的测试名称中获取上下文。
  • 使用.each,您可以使用带标记的模板字面值轻松处理多个参数,并且随着参数的增长,.each可以非常有表现力,比具有任意值的数组更具可读性。
  • 正如我之前所说的,由于.each为每个项目创建了一个单独的测试,所以最终的报告会让人觉得您编写的测试比实际编写的要多,这只是一件小事,当您查看最终输出时会感到满意。
bxgwgixi

bxgwgixi2#

我更喜欢普通的JS forEach版本,因为它只是JavaScript。这意味着:

  • 你不需要特别熟悉Jest,你不需要去看文档来了解test.each到底是做什么的,尤其是test.eachtable``表单,它的行为方式令人惊讶,例如Jest test.each with literal table: "Not enough arguments supplied for given headings"
  • 同样,它在测试框架之间也是可移植的,您可以在Mocha、Tap等中使用相同的方法。
  • 您可以获得适当的IDE支持-您需要等待运行时来确定'.add($a, $b)'是否实际匹配对象中的属性,而.add(${a}, ${b})可以静态地检查和自动完成(并且可以按照您的意愿进行操作,因为您可以插入任意表达式)。

测试的执行或报告方式没有任何区别。forEach循环在测试 * 发现 * 时运行,并且所有三个测试都已注册。然后它们都在 * 执行 * 时单独运行。如果您将循环移动到单个测试用例 * 内部 *,您只会看到故障影响其他用例的问题,例如:

describe('some bad tests', () => {
  // this an example of how not to do it
  test('num tests', () => {
    [1, 2, 3].forEach(num => {
      doSomeTestStuff(num)
    }) 
  })
})

对于forEach方法,还有一点需要注意的是,正如您所展示的,内联测试用例数组是很常见的,如果您依赖ASI,正如您的示例所显示的,这有时意味着您需要用; * 前缀 * 数组:

describe('some tests', () => {
  [1, 2, 3].forEach(num => {
    test(`${num}: test`, () => {
      doSomeTestStuff(num)
    }) 
  })

  ;[4, 5, 6].forEach(num => {
    test(`${num}: test`, () => {
      doSomeTestStuff(num)
    }) 
  })
})

没有这个,你会得到TypeError: Cannot read property '6' of undefined
这也许是对Jest的赞成票,但是如果你不打算使用分号,你就需要知道什么时候会插入分号,什么时候不会插入分号--我认为这是对分号的赞成票。

qpgpyjmq

qpgpyjmq3#

test.each的一个优势是更好的工具支持,我刚刚在VS代码插件 orta.vscode-jest 中注意到了这一点。

相关问题