无法模拟模拟对象的方法? call_count 在pytest中为0
Cannot mock method of mocked object? call_count is 0 in pytest
我在文件myfile.py中有以下函数:
#myfile.py
import psutil
class RunnableObject:
def run(self):
parent = psutil.Process()
print(parent)
children = parent.children(recursive=True)
print(children)
然后我有一个单元测试,其中 runnable_object 是我使用 pytest fixture 设置的 RunnableObject class 的一个实例。
@patch("myfile.psutil")
def test_run_post_request(self, psutil_, runnable_object):
runnable_object.run()
assert psutil_.Process.call_count == 1
assert psutil_.Process.children.call_count == 1
当我 运行 我的测试但是我得到以下错误:
assert psutil_.Process.call_count == 1
> assert psutil_.Process.children.call_count == 1
E assert 0 == 1
E +0
E -1
-1
tests/unit/test_experiment.py:1651: AssertionError
我的标准输出:
<MagicMock name='psutil.Process()' id='3001903696'>
<MagicMock name='psutil.Process().children()' id='3000968624'>
我也尝试过使用 @patch.object(psutil.Process, "children")
以及 @patch("myfile.psutil.Process")
和 @patch("myfile.psutil.Process.children")
但是这给了我同样的问题。
children
是 psutil.Process()
的 return 值的 属性。不是 Process
方法的 属性。
所以正确的说法是:
test_myfile.py
:
from unittest import TestCase
import unittest
from unittest.mock import patch
from myfile import RunnableObject
class TestRunnableObject(TestCase):
@patch("myfile.psutil")
def test_run_post_request(self, psutil_):
runnable_object = RunnableObject()
runnable_object.run()
assert psutil_.Process.call_count == 1
assert psutil_.Process().children.call_count == 1
if __name__ == '__main__':
unittest.main()
测试结果:
<MagicMock name='psutil.Process()' id='4394128192'>
<MagicMock name='psutil.Process().children()' id='4394180912'>
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
Name Stmts Miss Cover Missing
-------------------------------------------------------------------------
src/Whosebug/67362647/myfile.py 7 0 100%
src/Whosebug/67362647/test_myfile.py 13 0 100%
-------------------------------------------------------------------------
TOTAL 20 0 100%
我在文件myfile.py中有以下函数:
#myfile.py
import psutil
class RunnableObject:
def run(self):
parent = psutil.Process()
print(parent)
children = parent.children(recursive=True)
print(children)
然后我有一个单元测试,其中 runnable_object 是我使用 pytest fixture 设置的 RunnableObject class 的一个实例。
@patch("myfile.psutil")
def test_run_post_request(self, psutil_, runnable_object):
runnable_object.run()
assert psutil_.Process.call_count == 1
assert psutil_.Process.children.call_count == 1
当我 运行 我的测试但是我得到以下错误:
assert psutil_.Process.call_count == 1
> assert psutil_.Process.children.call_count == 1
E assert 0 == 1
E +0
E -1
-1
tests/unit/test_experiment.py:1651: AssertionError
我的标准输出:
<MagicMock name='psutil.Process()' id='3001903696'>
<MagicMock name='psutil.Process().children()' id='3000968624'>
我也尝试过使用 @patch.object(psutil.Process, "children")
以及 @patch("myfile.psutil.Process")
和 @patch("myfile.psutil.Process.children")
但是这给了我同样的问题。
children
是 psutil.Process()
的 return 值的 属性。不是 Process
方法的 属性。
所以正确的说法是:
test_myfile.py
:
from unittest import TestCase
import unittest
from unittest.mock import patch
from myfile import RunnableObject
class TestRunnableObject(TestCase):
@patch("myfile.psutil")
def test_run_post_request(self, psutil_):
runnable_object = RunnableObject()
runnable_object.run()
assert psutil_.Process.call_count == 1
assert psutil_.Process().children.call_count == 1
if __name__ == '__main__':
unittest.main()
测试结果:
<MagicMock name='psutil.Process()' id='4394128192'>
<MagicMock name='psutil.Process().children()' id='4394180912'>
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
Name Stmts Miss Cover Missing
-------------------------------------------------------------------------
src/Whosebug/67362647/myfile.py 7 0 100%
src/Whosebug/67362647/test_myfile.py 13 0 100%
-------------------------------------------------------------------------
TOTAL 20 0 100%