如果用特定的嵌套对象调用函数,我想测试一下。
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
的返回值上。void
与toHaveBeenCalledWith
:的签名不一致
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