Обезьяна-патчинг с ложными предметами в Ракетке - PullRequest
1 голос
/ 01 апреля 2020

Racket имеет несколько аккуратных библиотек тестирования, включая Rackunit и Mock . Мне было интересно, есть ли стандартный способ обезопасить внутренние вызовы в тестируемой функции (например, python mock.patch ), используя эти или другие библиотеки.

То есть предположим, что мы тестируем эту функцию:

(define (compute x)
  (+ 1 (consult-api x))

Мы хотим проверить, что compute дает ожидаемые результаты с различными возвращаемыми значениями consult-api, которые мы могли бы проверить с помощью Rackunit проверка . Мы хотели бы заменить consult-api макетом для целей теста.

Библиотека макетов предлагает добавить аргументы ключевых слов в тестируемую функцию, чтобы мы могли предоставить такие макеты чтобы использовать его во время тестирования, но я надеялся на способ, который не включал бы изменение исходной функции.

Кажется, что то, что мы ищем здесь, может быть выполнено с помощью некоторого макроса, переписав экземпляры consult-api как mock-consult-api, последний из которых будет макетом, определенным в тесте. Я не достаточно знаком с макросами Racket, чтобы знать, можно ли определить такой макрос в тесте и применить ли его к компиляции тестируемого модуля.

Как это сделать sh лучший / безрассудный способ?

1 Ответ

0 голосов
/ 03 апреля 2020

Вы определенно можете сделать это с помощью макроса. Это будет намного проще, если вы позволите себе добавить одну или две строки в начало файла. Я утверждаю, что один из принципов дизайна Racket - это сильная раздельная компиляция; то есть, значение файла зависит от текста файла (и, конечно, от значений модулей, которые ему требуются).

Вы также можете взглянуть на модули, которые были разработаны для обеспечения гибкого времени выполнения. ссылки. Честно говоря, за последние 20 лет они не получили широкого применения.

...