Racket 有一些简洁的测试库,包括 Rackunit和 Mock .我想知道是否有一种标准方法可以使用这些或其他库来对被测函数中的内部调用进行猴子修补(例如类似于 python 的 mock.patch )。
也就是说,假设我们正在测试这个函数:
(define (compute x)
(+ 1 (consult-api x))
我们想检查 compute
是否产生了具有不同返回值的预期结果 consult-api
,我们可以使用 Rackunit checks 进行验证.出于测试目的,我们想用模拟替换 consult-api
。
模拟库 suggests向被测试的函数添加关键字参数,以便我们可以为其提供此类模拟以供在测试期间使用,但我希望有一种不涉及修改原始函数的方法。
我们在这里寻找的似乎可以通过某种宏来实现,通过将 consult-api
的实例重写为 mock-consult-api
,后者将是测试中定义的模拟。我对 Racket 宏不够熟悉,不知道是否可以在测试中定义这样的宏并将其应用于被测试模块的编译。
一个人应该如何以最好的/最好的方式实现这一目标?
最佳答案
您绝对可以使用宏来完成此操作。如果您允许自己在文件顶部添加一两行,事情就会变得容易得多。我声称 Racket 的设计原则之一是强大的独立编译;也就是说,文件的含义取决于文件的文本(当然还取决于它所需要的模块的含义)。
您还可以查看单元,它旨在允许灵活的运行时链接。公平地说,它们在过去 20 年中并没有得到太多使用。
关于unit-testing - 在 Racket 中使用模拟对象进行猴子修补,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60978234/