0

我有一个 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 模拟库相当新,所以不太确定,这里发生了什么或者我做错了什么或者我应该如何接近它?

4

1 回答 1

1

像这样的东西可以工作:

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
于 2020-03-22T09:31:04.217 回答