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 лучший / безрассудный способ?