Слабое совпадение с одним значением в jest.toHaveBeenCalledWith - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть аналитический трекер, который будет вызывать только через 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"}

Я смотрел на шутка но я не вижу ничего полезного для моего варианта использования.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Это можно сделать с помощью асимметричных сопоставителей (введено в 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)
  })
)
0 голосов
/ 14 сентября 2018

Вы можете получить доступ к ожидаемому объекту для лучшего утверждения, используя track.mock.calls[0][0] (первое [0] - это номер вызова, а второе [0] - это номер аргумента). Тогда вы можете использовать toMatchObject, чтобы найти частично совпадающий объект, избегая динамических параметров, таких как intervalInMilliseconds.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...