我有一个分析跟踪器,它只会在1秒后调用,并且带有一个intervalInMilliseconds
(持续时间)值为非确定性的对象。
如何使用jest.toHaveBeenCalledWith
测试对象?
test('pageStats - publicationPage (will wait 1000ms)', done => {
const track = jest.fn()
const expected = new PayloadTiming({
category: 'PublicationPage',
action: 'PublicationPage',
name: 'n/a',
label: '7',
intervalInMilliseconds: 1000 // or around
})
mockInstance.viewState.layoutMode = PSPDFKit.LayoutMode.SINGLE
const sendPageStats = pageStats({
instance: mockInstance,
track,
remoteId: nappConfig.remoteId
})
mockInstance.addEventListener('viewState.currentPageIndex.change', sendPageStats)
setTimeout(() => {
mockInstance.fire('viewState.currentPageIndex.change', 2)
expect(track).toHaveBeenCalled()
expect(track).toHaveBeenCalledWith(expected)
done()
}, 1000)
expect(track).not.toHaveBeenCalled()
})
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"}
我已经查看了jest-extended,但没有看到任何对我的用例有用的内容。
4条答案
按热度按时间pbossiut1#
这可以通过非对称匹配器(在Jest 18中引入)来实现
如果使用
jest-extended
,则可以执行以下操作ozxc1zmp2#
您可以使用
track.mock.calls[0][0]
(第一个[0]
是调用编号,第二个[0]
是参数编号)访问预期的对象以获得更好的Assert。然后您可以使用toMatchObject
查找部分匹配的对象,避免使用动态参数,如intervalInMilliseconds
。vbkedwbf3#
通过cl0udw4lk3r重新迭代注解,因为我发现这在我的场景中最有用:
如果您有一个接受多个参数(而不是对象)的方法,并且您只想匹配其中的一些参数,那么您可以使用
expect
object。示例
我想测试方法:
我想确保正确的值被传递到
key
和ttl
,但我不关心传入的对象是什么。因此我设置了一个spy:我可以预期这样的场景:
您还可以使用
expect.any
(expect.any(Number)
)等更强类型的调用。y4ekin9u4#
当然我有偏见,但我认为这是最好的和最干净的方法。你可以使用扩展操作符
...
来扩展你正在检查的对象,然后覆盖(或添加)一个或多个值。以下示例显示了如何将“intervalInMilliseconds”预期值覆盖为任意数字
显示如何覆盖两个值的另一个示例