【问题标题】:How do you mock a function which has decorator apply to it in a unit test?你如何模拟一个在单元测试中应用了装饰器的函数?
【发布时间】:2012-04-24 16:36:15
【问题描述】:
@lolcat_decorator1
@loldog_decorator2
@lolrat_decorator3
def lolanimal(*args, **kwargs):
  ....

我确信我会单独对这些装饰器进行单元测试。但是这些装饰器会首先对传递给lolanimal 的参数进行处理,然后lolanimal 将对那些修改过的参数进行处理(其中一个装饰器可能会向**kwargs 插入新的关键字参数。)

那么模拟它的最佳方法是什么?

谢谢

【问题讨论】:

  • 你为什么使用装饰器?这似乎是一个教科书式的继承案例。
  • 我的团队中有人认为使用装饰器是个好主意。嗯……我回不去了。太多的代码都在使用它:(我的意思是装饰器只是函数。我想我可以修补它们……只是想知道人们是否真的有更好的主意?

标签: python unit-testing mocking


【解决方案1】:

我的第一个想法是创建一个_lolanimal 方法来封装lolanimal 的所有实际功能,然后将lolanimal 作为_lolanimal 周围的传递包装器。然后,您可以使用您完全控制的数据针对 _lolanimal 运行所有测试。

您还可以创建第二个装饰器,它会在第一个装饰器之前读取配置值或某种测试模式的东西,如果配置值为 true,则该装饰器将覆盖 lolspecific 装饰器...

【讨论】:

  • 感谢您的建议。它非常有用。第一种方法是否意味着我可以;不能使用装饰器?
  • @CppLearner 你只需要装饰包装器而不是实现方法。
【解决方案2】:

我的第一个想法是你应该将装饰器视为函数实现的一部分,并对“函数”进行单元测试,但希望你不需要将依赖项注入这些装饰器 - 如果你这样做了,那么需要考虑 Silas Ray 的回答。

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2016-08-20
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2011-03-02
    • 2012-11-01
    • 2016-12-30
    相关资源
    最近更新 更多