首页 > 解决方案 > 如何模拟由类的对象调用的函数?

问题描述

我将首先承认我刚刚进入 python 模拟或任何模拟这一天或两天。

所以我有一个python文件,里面有一个类:

我的文件A.py

class A:
    def Afunc():
        #do smthn

现在我想模拟一个使用这个 MyFileA.py 的不同脚本

我的文件B.py

from MyFileA import A

def Bfunc():
    Aobj = A()
    ReturnVal = Aobj.Afunc()

如何模拟语句Aobj.Afunc()以返回特定值?

另外,我专门使用装饰器来模拟方法,所以我只期待这种格式的解决方案。

标签: pythonunit-testingpython-mock

解决方案


您可以使用mock.patch来模拟类A及其Afunc返回值。

例如

MyFileA.py

class A:
    def Afunc():
        print('do smthn')

MyFileB.py

from MyFileA import A


def Bfunc():
    Aobj = A()
    ReturnVal = Aobj.Afunc()
    return ReturnVal

test_MyFileB.py

import unittest
from MyFileB import Bfunc
from unittest import mock


class TestMyFileB(unittest.TestCase):
    @mock.patch('MyFileB.A')
    def test_Bfunc(self, mock_A):
        a_instance = mock_A.return_value
        a_instance.Afunc.return_value = "mocked value"
        actual = Bfunc()
        self.assertEqual(actual, 'mocked value')
        mock_A.assert_called_once()
        a_instance.Afunc.assert_called_once()


if __name__ == '__main__':
    unittest.main()

带有覆盖率报告的单元测试结果:

.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
Name                                         Stmts   Miss  Cover   Missing
--------------------------------------------------------------------------
src/stackoverflow/63429593/MyFileA.py            3      1    67%   3
src/stackoverflow/63429593/MyFileB.py            5      0   100%
src/stackoverflow/63429593/test_MyFileB.py      13      0   100%
--------------------------------------------------------------------------
TOTAL                                           21      1    95%

推荐阅读