我有一个档案my_work.py
。该类MyModel
在类MyWork
的run
方法内部使用。假设 的功能MyModel
通过其自己的专用单元测验得到了很好的测验。我的重点是测验是否MyModel
在内部正确使用MyWork
。
我需要测验两件事:
- 如果
MyModel
用给定的自变量实体化。 - 如果
MyModel.run
方法被呼叫。因为这是一个漫长而昂贵的程序,我不得不用虚假的回报来嘲笑它。
需要注意的是,这两个类MyModel
以及MyWork
在同一档案中定义my_work.py
。这只是这篇文章的一个例子。在我的实际应用程序中,它们是在不同的 py 档案中定义的。不确定这是否会有所作为。
我已经尝试自己为它撰写单元测验,但我做不到。请你帮助我好吗?查看我的测验档案test_my_work.py
。提前非常感谢!
这是档案:my_work.py
.
from typing import Tuple
class MyModel:
def __init__(self, a: float, b: str):
self._a = a
self._b = b
def run(self) -> Tuple[float, float]:
# some long and expensive calculation.
return self._a 1, self._a 2
class MyWork:
def __init__(self, name: str):
self._name = name
self._res_1: float = 0
self._res_2: float = 0
def run(self) -> Tuple[float, float]:
a = 2.5
b = self._name
model = MyModel(a=a, b=b)
res_1, res_2 = model.run()
return res_1, res_2
这是档案:test_my_work.py
.
import unittest
from unittest.mock import patch
from my_work import MyModel, MyWork
class TestMyWork(unittest.TestCase):
@patch.object(MyModel, 'run', return_value=(3.5, 4.5))
def test_if_my_model_run_is_called_in_my_work_run(self, mocked_run):
self._my_work = MyWork(name='XX')
self._my_work.run()
mocked_run.assert_called_once()
@patch.object(MyModel, '__init__')
def test_if_my_model_is_initiated_in_my_work_run(self, mocked_init):
self._my_work = MyWork(name='XX')
self._my_work.run()
mocked_init.assert_called_once_with(a=2.5, b='XX')
if __name__ == '__main__':
unittest.main()
uj5u.com热心网友回复:
我建议宁愿使用该patch
方法而不是patch.object
因为MagicMock
不支持模拟该__init__
方法。
对于该patch
方法,您需要类的“目标”路径。在这种情况下,它将是'my_work.MyModel'
。
如果你像这样修补你的模型:
@patch('my_work.MyModel')
def test_if_my_model_is_initiated_in_my_work_run(self, my_model_mock):
...
然后my_model_mock
将是该类的模拟,MyModel
并将被替换为MagicMock
.
my_model.return_value
将在呼叫 的新实体时MyModel
呼叫。run
然后可以像这样模拟该方法:
my_model_mock.return_value.run.return_value = (3.5, 4.5)
0 评论