Как протестировать определенную последовательность вызовов одной и той же функции с помощью jest

#typescript #unit-testing #jestjs

#typescript #модульное тестирование #jestjs

Вопрос:

У меня есть класс, который я пытаюсь протестировать, который в шутку выполняет последовательность вызовов фиктивной функции:

вызовы, которые я хочу протестировать

У меня есть макет для Gpio конструктора класса, который создает экземпляры объектов за этими свойствами. Макет класса имеет макет метода для digitalWrite :

макет класса

И когда я запускаю свой тест, я вижу последовательность вызовов digitalWrite:

последовательность

Но я не могу понять, как проверить правильность последовательности. Мне кажется, что если я увижу последовательность в подсказке test fail, я смогу сказать «вызовите сначала с 0, затем с 0, затем с 1», но я не совсем понимаю, как это сделать. Есть идеи?

Также, чтобы на это не указывали: Я знаю, что технически каждый из экземпляров pin-кода должен быть отдельным, и я должен иметь возможность тестировать их по отдельности, но из-за того, как вы издеваетесь над конструкторами в шутку, я должен использовать одну и ту же фиктивную функцию для digitalWrite .

Ответ №1:

Вы можете использовать jest .toHaveBeenNthCalledWith()

например

 it('should be called in the following sequence', () => {
  expect(......digitalWrite).toHaveBeenNthCalledWith(1, 0)
  expect(......digitalWrite).toHaveBeenNthCalledWith(2, 0)
  expect(......digitalWrite).toHaveBeenNthCalledWith(3, 1)
})
  

или вы можете использовать свойство mock.calls макетной функции:

 it('should be called in the following sequence', () => {
  expect(......digitalWrite).toHaveProperty('mock.calls', [
    [0], [0], [1]
  ])
})
  

Комментарии:

1. О, здорово!! Да, это работает отлично. Полезно знать о втором варианте, похоже, что это сделает этот тест более читаемым. Спасибо!!