我有一個檔案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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407857.html
標籤:
