在自定义匹配器中测试嵌套对象



如果用特定的嵌套对象调用函数,我想测试一下。

myFunction({ variables: { input: { id: 12345, foo: 'bar' }}})

这就是我在测试中的expect

expect(myFunction).toHaveBeenCalledWith(
expect.objectContaining({
variables: expect.objectContaining({
input: expect.objectContaining({
id: 12345,
foo: 'bar'
})
})
})
)

我喜欢这个,因为在测试失败的情况下,错误消息非常有用。

由于我必须对对象进行多次测试,我希望将toHaveBeenCalledWith提取到自己的函数中,或者更好地构建一个自定义匹配器。

仅仅将可重复的部分放入自己的功能中是不正确的:

export const parameterFunctionCall = (param: object, name: string = "input"): void => {
expect.objectContaining({
variables: expect.objectContaining({
[name]: expect.objectContaining(param)
})
})
}
expect(myFunction).toHaveBeenCalledWith(
parameterFunctionCall({
id: 12345,
foo: 'bar'
})
)

我认为问题出在parameterFunctionCall的返回值上。voidtoHaveBeenCalledWith:的签名不一致

function (
this: MatcherState,
received: any,
...expected: Array<unknown>
): SyncExpectationResult { ... }

在您的情况下,这意味着您应该返回一个ObjectContaining的实例,而不是void,如下所示:

export const parameterFunctionCall = (param: object, name: string = "input") => {
return expect.objectContaining({
variables: expect.objectContaining({
[name]: expect.objectContaining(param)
})
})
}

想想看,如果你不从parameterFunctionCall返回任何东西,toHaveBeenCalledWith怎么知道该与什么匹配?此外,我看不出你写的有任何其他问题(但我绝对不是TS方面的专家(。

为什么这对您不起作用?你错过这个功能了吗?

expect(data).toHaveProperty(['variables', 'input', 'foo'], 'bar');
expect(data).toHaveProperty(['variables', 'input', 'id'], 12345);
test('test', () => {
let data = { variables: { input: {id: 12345, foo: 'bar' }}}
expect(data).toHaveProperty(['variables', 'input', 'id'], 12345)
expect(data).toHaveProperty(['variables', 'input', 'foo'], 'bar')
let f = jest.fn(() => true)
f(data)
expect(f).toHaveBeenCalledWith(data)
})

如果你不想使用这个函数,我为你做了一个递归函数。

let data = { variables: { input: {id: 12345, foo: 'bar' }}}
const nestedCheckerRecursive = (data, arr, iteration) => {
if (arr.length == iteration) return
expect(data[arr[iteration].propName])[arr[iteration].method](arr[iteration].data)
nestedCheckerRecursive(data[arr[iteration].propName], arr, iteration + 1)
}
test('test', () => {
nestedCheckerRecursive(data, [
{
propName: "variables",
method: "toBeDefined"
},
{
propName: "input",
method: "toBeDefined"
},
{
propName: "id",
method: "toEqual",
data: 12345
}
], 0)
});

也许我误解了你的问题。idk

相关内容

  • 没有找到相关文章