有什么理由让我更喜欢其中一种方法吗?下面是一些例子:
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仍然以同样的方式发生(据我所知)。
3条答案
按热度按时间6jygbczu1#
问得好!
从表面上看,这两种方法基本上是等效的,但是您可能希望使用
.each
,这有几个原因。forEach
中的一个期望失败了,它会立即失败并停止执行,这让你不知道forEach
中的其他测试是通过还是失败,对于.each
,它基本上是为数组中的每一项编写一个单独的和不同的测试。forEach
中的一个期望失败,并不总是很明显是数组中的哪一项导致了失败,在.each
中,您会自动从唯一的测试名称中获取上下文。.each
,您可以使用带标记的模板字面值轻松处理多个参数,并且随着参数的增长,.each
可以非常有表现力,比具有任意值的数组更具可读性。.each
为每个项目创建了一个单独的测试,所以最终的报告会让人觉得您编写的测试比实际编写的要多,这只是一件小事,当您查看最终输出时会感到满意。bxgwgixi2#
我更喜欢普通的JS
forEach
版本,因为它只是JavaScript。这意味着:test.each
到底是做什么的,尤其是test.each
table``表单,它的行为方式令人惊讶,例如Jest test.each with literal table: "Not enough arguments supplied for given headings"。'.add($a, $b)'
是否实际匹配对象中的属性,而.add(${a}, ${b})
可以静态地检查和自动完成(并且可以按照您的意愿进行操作,因为您可以插入任意表达式)。测试的执行或报告方式没有任何区别。
forEach
循环在测试 * 发现 * 时运行,并且所有三个测试都已注册。然后它们都在 * 执行 * 时单独运行。如果您将循环移动到单个测试用例 * 内部 *,您只会看到故障影响其他用例的问题,例如:对于
forEach
方法,还有一点需要注意的是,正如您所展示的,内联测试用例数组是很常见的,如果您依赖ASI,正如您的示例所显示的,这有时意味着您需要用;
* 前缀 * 数组:没有这个,你会得到
TypeError: Cannot read property '6' of undefined
。这也许是对Jest的赞成票,但是如果你不打算使用分号,你就需要知道什么时候会插入分号,什么时候不会插入分号--我认为这是对分号的赞成票。
qpgpyjmq3#
test.each
的一个优势是更好的工具支持,我刚刚在VS代码插件 orta.vscode-jest 中注意到了这一点。