Jestjs 松散匹配jest.TohaveEncalledWith中的一个值

Jestjs 松散匹配jest.TohaveEncalledWith中的一个值,jestjs,Jestjs,我有一个分析跟踪器,它只会在1秒后调用,并且对象的intervalInMilliseconds(持续时间)值是而不是确定性的 如何使用jest.tohavencalledwith测试对象 test('pageStats-publicationPage(将等待1000ms)),完成=>{ const track=jest.fn() const expected=新的有效加载时间({ 类别:“PublicationPage”, 操作:“PublicationPage”, 名称:“不适用”, 标签:‘

我有一个分析跟踪器,它只会在1秒后调用,并且对象的
intervalInMilliseconds
(持续时间)值是而不是确定性的

如何使用
jest.tohavencalledwith
测试对象

test('pageStats-publicationPage(将等待1000ms)),完成=>{
const track=jest.fn()
const expected=新的有效加载时间({
类别:“PublicationPage”,
操作:“PublicationPage”,
名称:“不适用”,
标签:‘7’,
间隔毫秒:1000//或左右
})
mockInstance.viewState.layoutMode=PSPDFKit.layoutMode.SINGLE
const sendPageStats=pageStats({
实例:mockInstance,
轨道,
remoteId:nappConfig.remoteId
})
mockInstance.addEventListener('viewState.currentPageIndex.change',sendPageStats)
设置超时(()=>{
mockInstance.fire('viewState.currentPageIndex.change',2)
expect(track).tohavebeincalled(预期)
预期(轨道)。与(预期)一起被收集
完成()
}, 1000)
expect(track).not.tohavebeincall()
})
expect(track).toHaveBeenCalledWith(expected)
失败,原因是:

Expected mock function to have been called with:
      {"action": "PublicationPage", "category": "PublicationPage", "intervalInMilliseconds": 1000, "label": "7", "name": "n/a"}
    as argument 1, but it was called with
      {"action": "PublicationPage", "category": "PublicationPage", "intervalInMilliseconds": 1001, "label": "7", "name": "n/a"}
我看过
但是我没有看到任何对我的用例有用的东西。

您可以使用
track.mock.calls[0][0]
访问期望的对象以获得更好的断言(第一个
[0]
是调用号,第二个
[0]
是参数号)。然后,您可以使用
toMatchObject
查找部分匹配对象,避免动态参数,如
intervalinMilliskes
这可以通过非对称匹配器来完成(在Jest 18中介绍)

expect(track).toHaveBeenCalledWith(
expect.objectContaining({
“操作”:“PublicationPage”,
“类别”:“PublicationPage”,
“标签”:“7”,
“名称”:“不适用”
})
)
如果您使用
jest extended
可以执行以下操作

expect(track).toHaveBeenCalledWith(
expect.objectContaining({
“操作”:“PublicationPage”,
“类别”:“PublicationPage”,
“标签”:“7”,
“名称”:“不适用”,
“intervalInMilliseconds”:预期为(999,1002)
})
)
重新迭代,因为我发现这在我的场景中最有用:

如果您有一个接受多个参数(而不是对象)的方法,并且您只想匹配其中一些参数,那么您可以使用

示例

我要测试的方法:

client.setex(key,ttl,JSON.stringify(obj));
我想确保将正确的值传递到
ttl
中,但我不关心传递的对象是什么。所以我设置了一个间谍:

const setexSpy=jest.spyOn(mockClient,“setex”); 因此,我可以预期这种情况:

expect(setexSpy).toHaveBeenCalledWith('test',99,expect.anything());

您还可以使用(
expect.any(Number)
)等使用更多的强类型调用。

似乎您可以使用
expect.anything
另外:@cl0udw4lk3r
expect.anything()
不检查调用参数是什么,它只是检查它们是否是参数。