我有一个分析跟踪器,它只会在 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
但我没有看到任何对我的用例有用的东西。

最佳答案

这可以通过非对称匹配器来完成(在 Jest 18 中引入)

expect(track).toHaveBeenCalledWith(
  expect.objectContaining({
   "action": "PublicationPage",
   "category": "PublicationPage",
   "label": "7",
   "name": "n/a"
  })
)

如果你使用 jest-extended 你可以做类似的事情

expect(track).toHaveBeenCalledWith(
  expect.objectContaining({
   "action": "PublicationPage",
   "category": "PublicationPage",
   "label": "7",
   "name": "n/a",
   "intervalInMilliseconds": expect.toBeWithin(999, 1002)
  })
)

关于jestjs - 松散匹配 jest.toHaveBeenCalledWith 中的一个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52337116/

10-13 06:03