【问题标题】:Mocking methods that been called in method's signatures在方法的签名中调用的模拟方法
【发布时间】:2019-12-04 14:49:54
【问题描述】:

我正在寻找一种方法来模拟由于获取参数的默认值而被调用的方法。

比如a.py是:

class A():
    def __init__(self, arg=ToBeMocked())

ToBeMocked()会在调用后调用:

from a import A

ToBeMocked() 如何在调用 import 语句之前被模拟?

【问题讨论】:

  • 向我们展示__init__的正文!
  • ToBeMocked 甚至在进入 init 的主体之前就被调用了

标签: python python-2.7 mocking python-unittest


【解决方案1】:

在从a 模块导入A 类之前,使用unittest.mock.patch 修补ToBeMocked 函数。

例如

a.py:

from arg import ToBeMocked


class A():
    def __init__(self, arg=ToBeMocked()):
        self.arg = arg

arg.py:

def ToBeMocked():
    return 'teresa teng'

test_a.py:

import unittest
from unittest import mock


class TestA(unittest.TestCase):
    @mock.patch('arg.ToBeMocked')
    def test__init__(self, mock_ToBeMocked):
        mock_ToBeMocked.return_value = 'Love Teresa Teng'
        from a import A
        a_instance = A()
        self.assertEqual(a_instance.arg, 'Love Teresa Teng')
        mock_ToBeMocked.assert_called_once()


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

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

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

OK
Name                                   Stmts   Miss  Cover   Missing
--------------------------------------------------------------------
src/stackoverflow/59178731/a.py            4      0   100%
src/stackoverflow/59178731/arg.py          2      1    50%   2
src/stackoverflow/59178731/test_a.py      11      0   100%
--------------------------------------------------------------------
TOTAL                                     17      1    94%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多