【发布时间】:2018-07-31 13:27:16
【问题描述】:
今天我意识到 unittest.mock.patch 如何导入函数很重要。根据使用的方式,mock.patch 调用工作或被忽略。在 Python 中,我们通常导入一个函数:
- 像
import os这样的导入语句或 -
from ... import ...声明如from os import system
如果我使用import os,mock.patch 就像一个魅力,但它
如果我修补 from os import system,则会被忽略。
示例 1:使用导入
import os
from unittest import mock
def echo():
os.system('echo "Hello"')
with mock.patch('os.system') as mocked:
print(mocked)
mocked.side_effect = Exception('Patch works!')
echo()
示例 1 的输出
<MagicMock name='system' id='140037358656760'>
Traceback (most recent call last):
File "/.../config/scratches/scratch_7.py", line 12, in <module>
echo()
File "/.../config/scratches/scratch_7.py", line 6, in echo
os.system('echo "Hello"')
File "/.../python3.5/unittest/mock.py", line 917, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/.../python3.5/unittest/mock.py", line 973, in _mock_call
raise effect
Exception: Patch works!
示例 2:使用全功能导入和从导入
当我完全导入 os.system 时,mock.patch 会忽略 mocked.side_effect。
from os import system
from unittest import mock
def echo():
system('echo "Hello"')
with mock.patch('os.system') as mocked:
print(mocked)
mocked.side_effect = Exception('Patching does not work!')
echo()
print('Patch was ignored!')
示例 2 的输出
<MagicMock name='system' id='139851175427376'>
Hello
Patch was ignored!
在这两种情况下,我都没有收到错误,mock 可以找到 os.system 作为有效路径。但是,在第二种情况下,该功能未正确修补。
- 为什么
mock.patch没有修补第二个例子中的函数? - 是否存在导致第二个补丁不起作用的具体实施原因?
【问题讨论】:
-
当对象已经被导入当前命名空间时,通常你会使用
patch.object。不过,它可能不适用于system,因为它将是内置/只读的。
标签: python python-3.x python-unittest python-mock