【问题标题】:How to mock a function called by an object of a class?如何模拟由类的对象调用的函数?
【发布时间】:2020-12-05 08:02:12
【问题描述】:

我首先要承认我刚刚接触 python 模拟或任何模拟一两天。

所以我有一个包含类的 python 文件:

MyFileA.py

class A:
    def Afunc():
        #do smthn

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

MyFileB.py

from MyFileA import A

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

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

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

【问题讨论】:

  • “期待”? “渴望”怎么说?
  • @mock.patch('MyFileB.A.Afunc', return_value=42) 应该可以解决问题。

标签: python unit-testing python-mock


【解决方案1】:

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

例如

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%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多