簡體   English   中英

模擬作為默認參數傳遞的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM