比方說你有一個名爲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