使用 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%
我正在尝试模拟一个由单独模块中的另一个方法调用的方法。具体来说,我希望将 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%