【问题标题】:Monkey-patching with mock objects in Racket在 Racket 中使用模拟对象进行猴子修补
【发布时间】:2020-04-01 18:50:29
【问题描述】:

Racket 有一些简洁的测试库,包括RackunitMock。我想知道是否有一种标准方法可以使用这些库或其他库对正在测试的函数中的内部调用进行猴子补丁(例如,类似于 python 的mock.patch)。

也就是说,假设我们正在测试这个函数:

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

我们想检查compute 是否产生具有不同返回值consult-api 的预期结果,我们可以使用Rackunit checks 进行验证。为了测试的目的,我们想用模拟替换 consult-api

mock 库suggests 为正在测试的函数添加关键字参数,以便我们可以在测试期间向它提供此类模拟以供使用,但我希望有一种不涉及修改原始函数的方法。

似乎我们在这里寻找的东西可以通过某种宏来完成,通过将consult-api 的实例重写为mock-consult-api,后者将是测试中定义的模拟。我对 Racket 宏不够熟悉,不知道是否可以在测试中定义这样的宏并将其应用于正在测试的模块的编译。

一个人应该如何以最好/最不可靠的方式完成这项工作?

【问题讨论】:

    标签: unit-testing mocking racket rackunit


    【解决方案1】:

    您绝对可以使用宏来做到这一点。如果您允许自己在文件顶部添加一两行,这将变得容易得多。我声称 Racket 的设计原则之一是强分离编译。也就是说,文件的含义取决于文件的文本(当然也取决于它需要的模块的含义)。

    您还可以研究 Units,它旨在实现灵活的运行时链接。公平地说,它们在过去 20 年里并没有得到太多使用。

    【讨论】:

    • 感谢您的意见!您将在文件顶部添加哪一行?您能否澄清一下它将以何种方式使实施更容易?如果您能提供可用的代码,那就太理想了。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2017-06-01
    • 2010-10-01
    • 2016-10-30
    相关资源
    最近更新 更多