【发布时间】:2020-06-18 13:30:32
【问题描述】:
如何修补类中的方法,然后断言该修补方法仅被调用一次?
例如:
import typing
import unittest
import unittest.mock
class Example:
def __init__(self: "Example") -> None:
self._loaded : bool = False
self._data : typing.Union[str,None] = None
def data(self: "Example") -> str:
if not self._loaded:
self.load()
return self._data
def load(self: "Example") -> None:
self._loaded = True
# some expensive computations
self._data = "real_data"
def mocked_load(self: "Example") -> None:
# mock the side effects of load without the expensive computation.
self._loaded = True
self._data = "test_data"
class TestExample( unittest.TestCase ):
def test_load(self: "TestExample") -> None:
# tests for the expensive computations
...
@unittest.mock.patch("__main__.Example.load", new=mocked_load)
def test_data(
self: "TestExample",
# patched_mocked_load: unittest.mock.Mock
) -> None:
example = Example()
data1 = example.data()
self.assertEqual(data1, "test_data")
# example.load.assert_called_once()
# Example.load.assert_called_once()
# mocked_load.assert_called_once()
# patched_mocked_load.assert_called_once()
data2 = example.data()
self.assertEqual(data2, "test_data")
# Should still only have loaded once.
# example.load.assert_called_once()
# Example.load.assert_called_once()
# mocked_load.assert_called_once()
# patched_mocked_load.assert_called_once()
if __name__ == '__main__':
unittest.main()
如何在test_data 单元测试中断言修补后的load 函数只被调用一次?
【问题讨论】:
标签: python python-unittest python-unittest.mock