![](/img/trans.png)
[英]Get the argument passed to mock_open and call a different function for mock
[英]Mock a function passed as default parameter
我有一個 python 文件( a.py
),它定義了一個函數,以及一個類,它在它的 init 方法中使用它作為默認參數並初始化另一個導入的類。 這是我的a.py
import OtherClass
def useful_default_func():
//do something useful
class MyClass(object):
def __init__(self, def_func=useful_default_func):
self.other_class = OtherClass(def_func())
//do something useful
我試圖在我的測試文件中模擬useful_default_func
。
class TestMyClass(unittest.TestCase):
@patch('a.useful_default_func')
@patch('a.OtherClass')
test_init(self, mock_other_class, mock_default_func):
myc= MyClass()
mock_other_class.assert_called_once_with(mock_default_func)
// further tests
但是, mock_default_func
沒有打補丁,我的測試失敗說,
Expected: OtherClass(<MagicMock id='xxx'>)
Actual: OtherClass(<function useful_default_func at 0x7f155858b378>)
對 python 模擬庫相當陌生,所以不太確定,這里發生了什么,或者我做錯了什么,或者我應該如何接近它?
這樣的事情可以工作:
def mocked_fct():
return 42
class TestMyClass(unittest.TestCase):
@mock.patch.object(a.MyClass.__init__, '__defaults__', (mocked_fct,))
@patch('a.OtherClass')
def test_init(self, mock_other_class):
myc = MyClass()
mock_other_class.assert_called_once_with(mocked_fct)
我沒有在這里對模擬的默認函數使用模擬,如果需要,可以更改。 重點是您可以模擬函數默認值。
注意:這假設您調用
self.other_class = OtherClass(def_func)
代替
self.other_class = OtherClass(def_func())
如果這不是打字錯誤,那么您的斷言就不正確。 在這種情況下,您可以改為使用:
mock_other_class.assert_called_once_with(mocked_fct())
mock_other_class.assert_called_once_with(42) # same as above
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.