使用 unittest.mock.patch 全局模拟方法

Mock method globally with unittest.mock.patch

我正在尝试模拟一个由单独模块中的另一个方法调用的方法。具体来说,我希望将 bar.py 中对 foo 的调用替换为对 mock_foo:

的调用

foo.py

def foo():
    return 'foo'

bar.py

from foo import foo

def bar.py():
    return foo()

test.py

from bar import bar

def mock_foo():
    return 'mock_foo'

def testmethod():
    with patch('foo.foo', mock_foo):
        print(bar())  
        # Expected output:'mock_foo'

上面的patch方法行不通。这可能与模拟库有关吗?如果可以,我应该如何修改test.py?

您应该修补 bar 模块中导入的 foo 函数。所以,目标应该是 bar.foo.

例如

foo.py:

def foo():
    return 'foo'

bar.py:

from foo import foo


def bar():
    return foo()

test_bar.py:

from bar import bar
import unittest
from unittest.mock import patch


def mock_foo():
    return 'mock_foo'


class BarTest(unittest.TestCase):
    def test_bar(self):
        with patch('bar.foo', mock_foo):
            print(bar())
            self.assertEqual(bar(), 'mock_foo')


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

单元测试结果:

⚡  coverage run /Users/dulin/workspace/github.com/mrdulin/python-codelab/src/Whosebug/66540831/test_bar.py && coverage report -m --include './src/**'
mock_foo
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Name                                     Stmts   Miss  Cover   Missing
----------------------------------------------------------------------
src/Whosebug/66540831/bar.py            3      0   100%
src/Whosebug/66540831/foo.py            2      1    50%   2
src/Whosebug/66540831/test_bar.py      12      0   100%
----------------------------------------------------------------------
TOTAL                                       17      1    94%