【发布时间】:2021-01-10 16:04:30
【问题描述】:
我阅读了很多关于 unittest.mock 的文章,但我无法将其转移到我自己的场景中。所以我在这里创建了一个最小的工作示例。
我只是在测试之前替换一个函数,然后在测试结束时将其设置回原来的函数——不使用unittest.mock。 问题是如何使用unittest.mock替换函数或修改返回值。
Side-queston 是否有办法重置测试用例末尾隐含的模拟/补丁。目前它在tearDownClass() 中明确完成。但有时我会忘记这样的事情。
#!/usr/bin/env python3
class MyData:
me = None
def __init__(self):
MyData.me = self
self.data = self._get_default_data()
def _get_default_data(self):
return "real default data"
if __name__ == '__main__':
MyData()
print(MyData.me.data)
这是测试
import unittest
from mockplay import MyData
def _test_data(self):
return "simulated test data"
class MyTest_Sim(unittest.TestCase):
@classmethod
def setUpClass(cls):
# remember the original method
cls.org_method = MyData._get_default_data
# mock the method
MyData._get_default_data = _test_data
MyData()
@classmethod
def tearDownClass(cls):
# rest the mock/patch to the origiinal
MyData._get_default_data = cls.org_method
def test_data(self):
self.assertEqual(MyData.me.data,
"simulated test data")
背景资料:
真正的应用程序从 JSON 文件中读取与用户相关的内容(例如电子邮件)。第一次启动,直接安装后,没有这个json文件。因此,应用程序使用“内置”默认 JSON 文件。
每个测试都从一个“新”应用程序开始——文件系统上没有 JSON 文件。所以它使用_get_default_data()。
为了控制测试中存在哪些数据,我需要模拟/修补/替换此方法,因为默认 JSON 文件 a) 不适合所有测试用例,并且 b) 在应用程序开发过程中可能会发生变化。
【问题讨论】:
-
为什么需要模拟任何东西来测试这个?您正在测试的课程没有合作者,不需要测试替补。另外,您为什么要使用实例修补类?这是对单例模式的尝试吗?
-
输出是什么?但是,如果它不能代表您实际面临的情况,则该示例没有多大用处。这里的答案是:你显然不需要模拟任何东西,所以不,它不适合 unittest.mock,但是如果没有更多的上下文,这是否适用于实际情况还不清楚。你当然不应该修补你应该测试的部分。
-
我删除了附带问题并添加了一些关于真实应用程序的背景信息。
-
检查例如this question的答案以检查如何在
setUp/tearDown中使用patch。
标签: python-3.x python-unittest.mock