在球拍中使用模拟对象进行猴子修补
Monkey-patching with mock objects in Racket
Racket 有一些简洁的测试库,包括 Rackunit and Mock. I was wondering whether there's a standard way to monkey-patch internal calls in the function being tested (e.g. similar to python's mock.patch),可以使用这些库或其他库。
也就是说,假设我们正在测试这个函数:
(define (compute x)
(+ 1 (consult-api x))
我们要检查 compute
是否会产生具有 consult-api
的不同 return 值的预期结果,我们可以使用 Rackunit checks 对其进行验证。出于测试目的,我们想用模拟替换 consult-api
。
mock 库 suggests 向被测试的函数添加关键字参数,以便我们可以向其提供此类模拟以供测试期间使用,但我希望有一种不涉及修改原始函数的方法.
似乎我们在这里寻找的东西可以用某种宏来完成,通过将 consult-api
的实例重写为 mock-consult-api
,后者将是在测试。我对 Racket 宏不够熟悉,不知道是否可以在测试中定义这样的宏并将其应用于被测试模块的编译。
如何以 best/Rackety-est 的方式实现这一目标?
你绝对可以使用宏来做到这一点。如果您允许自己在文件顶部添加一两行,事情就会变得容易得多。我声称 Racket 的设计原则之一是强大的独立编译;也就是说,文件的含义取决于文件的文本(当然还取决于它所需要的模块的含义)。
您还可以查看 Units,它旨在允许灵活的运行时链接。公平地说,在过去的 20 年里,它们并没有得到太多的使用。
Racket 有一些简洁的测试库,包括 Rackunit and Mock. I was wondering whether there's a standard way to monkey-patch internal calls in the function being tested (e.g. similar to python's mock.patch),可以使用这些库或其他库。
也就是说,假设我们正在测试这个函数:
(define (compute x)
(+ 1 (consult-api x))
我们要检查 compute
是否会产生具有 consult-api
的不同 return 值的预期结果,我们可以使用 Rackunit checks 对其进行验证。出于测试目的,我们想用模拟替换 consult-api
。
mock 库 suggests 向被测试的函数添加关键字参数,以便我们可以向其提供此类模拟以供测试期间使用,但我希望有一种不涉及修改原始函数的方法.
似乎我们在这里寻找的东西可以用某种宏来完成,通过将 consult-api
的实例重写为 mock-consult-api
,后者将是在测试。我对 Racket 宏不够熟悉,不知道是否可以在测试中定义这样的宏并将其应用于被测试模块的编译。
如何以 best/Rackety-est 的方式实现这一目标?
你绝对可以使用宏来做到这一点。如果您允许自己在文件顶部添加一两行,事情就会变得容易得多。我声称 Racket 的设计原则之一是强大的独立编译;也就是说,文件的含义取决于文件的文本(当然还取决于它所需要的模块的含义)。
您还可以查看 Units,它旨在允许灵活的运行时链接。公平地说,在过去的 20 年里,它们并没有得到太多的使用。