比方说你有一个名为awesome.py和它模块,您有:
import time
class SomeProductionProcess(CustomCachedSingleTon):
def loaddata(self):
time.sleep(30) # simulating a long running process
return 2
那么你的单元测试,你嘲笑loaddata
看起来是这样的:
import unittest
import awesome # your application module
class TestSomeProductionProcess(unittest.TestCase):
"""Example of direct monkey patching"""
def test_loaddata(self):
some_prod_proc = awesome.SomeProductionProcess()
some_prod_proc.loaddata = lambda x: 2 # will return 2 every time called
output = some_prod_proc.loaddata()
expected = 2
self.assertEqual(output, expected)
或者它可能看起来像这样:
import unittest
from mock import patch
import awesome # your application module
class TestSomeProductionProcess(unittest.TestCase):
"""Example of using the mock.patch function"""
@patch.object(awesome.SomeProductionProcess, 'loaddata')
def test_loaddata(self, fake_loaddata):
fake_loaddata.return_value = 2
some_prod_proc = awesome.SomeProductionProcess()
output = some_prod_proc.loaddata()
expected = 2
self.assertEqual(output, expected)
现在,当您运行测试时,loaddata
将不会花费30秒来处理这些测试用例。
请注意,loaddata()是@classmethod。另外我想提供一个自定义的loaddata()来测试这个类中的另一个方法。 – user4654
考虑到这个问题,'模拟方法'会更加正确,因为当你说'class method'时,隐含了'classmethod'的模拟方法。一个方法总是一个类实例的一部分,一个classmethod是类的一部分。使用装饰器@classmethod使其正确更改方法并添加参数cls。 – msudder