【问题标题】:Expect array argument to have set length期望数组参数具有设置长度
【发布时间】:2020-10-04 17:59:56
【问题描述】:

我对 Jest 有点陌生,所以如果这是一个明显的答案,请原谅我,但在滚动浏览文档后我找不到答案。

我有一个函数(funcA),它根据funcA 接收的参数将不同长度的数组传递给另一个函数(funcB)。我正在尝试根据我提供给funcA 的参数来测试传递给funcB 的数组长度是否正确。我并不关心数组的内容,只是它有一定的长度。这是我目前的尝试:

// Modules
const funcA = require('./funcA')

// Mock
const funcB = jest.fn(pairs => {
    return pairs[0]
})

// Test
test('Should pass array of 3623 length', () => {
    const result = funcA(75)
    
    expect(result).toBeInstanceOf(Object)
    expect(funcB).toHaveBeenCalledWith(expect.any(Array).toHaveLength(3623))
})

如果可以的话,我想尝试使用any(),但以下测试导致错误:

TypeError: expect.any(...).toHaveLength 不是函数

即使我将expect.any(...) 包装在另一组括号中,我也会遇到同样的错误。有什么方法可以实现我想要的吗?

【问题讨论】:

  • funcA 和 funcB 有什么关系?如果 funcA 调用 funcB,你不能只通过给本地 funcB 变量分配一个 spy 来模拟它。

标签: jestjs


【解决方案1】:

只断言数组长度而忽略数组内容的测试没有什么价值。越具体越好。如果需要特定的数组,可以将其指定为夹具。

此断言不起作用,因为 toHaveBeenCalledWith 应该是预期结果,并且不能包含另一个断言 toHaveLength

为了用任何元素的数组断言toHaveBeenCalledWith,它应该是:

expect(funcB).toBeCalledWith(Array(3623).fill(expect.anything()))

另一种选择是直接断言参数:

expect(funcB).toBeCalledWith(expect.any(Array))
expect(funcB.mock.calls[0][0]).toHaveLength(3623))

【讨论】:

  • 谢谢,这正是我想要的!我也在测试数组中所有项目的结构都是对象并且具有正确的属性
猜你喜欢
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多