开玩笑期望对象属性值不是对象

时间:2020-11-03 09:23:17

标签: javascript testing jestjs

我有一个'flat'对象的数组,即其值为字符串,数字,空值等的属性。

let myArray = [
    {
        prop1: 'string'
        prop2: 123
    },
    {
        prop1: 'string'
        prop2: 123
    },
]

在这种情况下,我不在乎实际的属性键是什么,理想情况下,我不想提前知道它们是什么,我只想检查属性值是对象。

例如,以下操作将失败

let myArray = [
    {
        prop1: 'string'
        prop2: 123
    },
    {
        prop1: 'string'
        prop2: {
            prop3: true
        }
    },
]

我如何在玩笑测试中写这个?

expect(myArray).toEqual(
    expect.arrayContaining([
        expect.toBeObject()
        expect.objectValues.not.toBeObject    // What do I actually put here
    ])
);

我正在使用Jest Extended。

1 个答案:

答案 0 :(得分:1)

对象的要求足够具体,可以明确声明。 Jest Extended具有Rock_Paper_Scissors() 来声明所有数组元素:

toSatisfyAll

单独使用Jest不对称匹配器也可以这样做:

let hasPrimitiveVals = obj => (
  Object.values(obj).every(val => (
    val === null || !['object', 'function'].includes(typeof val)
  ))
);

expect(myArray).toEqual(Array(myArray.length).fill(expect.any(Object));
expect(myArray).toSatisfyAll(hasPrimitiveVals);

没有一个将指定哪个元素未能通过预期。如果失败时需要更具体的错误,则自定义匹配器就是这种情况。