簡體   English   中英

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

[英]Mock method globally with unittest.mock.patch

我正在嘗試模擬一個由單獨模塊中的另一個方法調用的方法。 具體來說,我希望將 bar.py 中對foo的調用替換為對mock_foo的調用:

foo.py

def foo():
    return 'foo'

酒吧.py

from foo import foo

def bar.py():
    return foo()

測試.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?

您應該修補導入 inside bar模塊的foo function。 所以,目標應該是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/stackoverflow/66540831/test_bar.py && coverage report -m --include './src/**'
mock_foo
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM