【问题标题】:How to mock the Django Model.save() function in python?如何在 python 中模拟 Django Model.save() 函数?
【发布时间】:2011-08-31 18:44:28
【问题描述】:

我正在使用mock library,我希望能够通过以下方式模拟我的模型类的save() 函数:

应该调用两次原始函数(并成功实际保存模型),第三次应该抛出异常。

这是针对调用save 三次的函数的单元测试(并且此特定测试需要处理只有第三次调用失败的情况)。

【问题讨论】:

  • “失败”?这很奇怪。您是否正在测试以查看 ORM 的工作原理?您是否正在测试您的数据库是否有效?这些都是非常奇怪的测试。如果您正在测试以查看重复项是否被拒绝,则不需要模拟,只需一个夹具。你在测试什么?
  • 我正在尝试测试我的代码对保存失败的反应,这可能由于各种原因而合法发生。我看不出固定装置在这里有什么帮助。
  • “保存失败”?我对此完全感到困惑。您是否尝试检测 RDBMS 中的故障?通过你的申请?那是大错特错了。如果 RDBMS 失败了,那么系统——作为一个整体——就太坏了,无法做出任何有效的断言。这不是你单元测试的那种想法。如果测试 RDBMS 故障,则必须测试 OS 故障、电源故障和其他随机天灾。为什么要停止使用 RDBMS?为什么不测试 Apache 故障? mod_wsgi 失败?
  • 保存可能会失败,例如,这样做违反了某些约束。然而,这无关紧要。上面的问题是关于一般技术的,我真的不认为争论所讨论的特定测试是否有必要。如上所述,我将不胜感激有关以不同结果模拟重复调用的答案。对另一个固定装置与模拟评论战不感兴趣(如stackoverflow.com/questions/3813688/…)。
  • “保存可能会失败,例如,这样做违反了某些约束”。然后提供一个测试用例。不涉及嘲笑。既然你有一个非常优雅的例子,为什么不使用它呢?

标签: python django unit-testing mocking


【解决方案1】:

基于http://pypi.python.org/pypi/mock 文档。

>>> values = [1, 2]
>>> def side_effect():
...     return values.pop()
...
>>> real = SomeModelClass()
>>> real.save = Mock(side_effect=side_effect)

应该工作两次,然后每次都以IndexError 失败。

我不知道当基础设施停止工作时,这可能证明您的代码有什么意义。您是否也在测试所有操作系统调用?所有 Python 库调用?所有其他 Django 方法都可以查看您的应用程序是否以某种方式应对了这些故障?

【讨论】:

  • 这似乎只返回两个值。我需要将前两个调用委托给原始方法,第三个调用引发异常。
  • @gigantt.com:第三次调用引发异常。你试过了吗? “委托”并不重要,因为您是在进行单元测试,而不是集成测试。
猜你喜欢
  • 2018-07-18
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2011-04-18
  • 2021-10-26
  • 2021-07-20
相关资源
最近更新 更多