在我的测试环境中,我在3个不同的目录中有一个test_a.py、a.py和b.py。在
b.py公司
class SBD():
def __init__(self):
print("SBD created (In B)")
a.py
^{pr2}$测试
import unittest
import sys
from unittest.mock import Mock,patch,MagicMock
sys.path.append("../abc/")
import b as c
sys.modules['b'] = MagicMock(spec=c)
sys.path.append("../xyz/")
import a
class TestStringMethods(unittest.TestCase):
def test_isupper(self):
a.fun1()
if __name__ == '__main__':
unittest.main()
我想在同一个模块中模仿它们,所以我想用同一个模块来嘲笑它们。但是当我运行test_a.py时,它会给我一个错误,说“SBD”没有定义。我做错什么了?在
MagicMock
实例与模块向导入机制提供的信息不同。即使使用spec
,也没有在mock上定义实际的SDB
属性,因此from b import *
找不到它。在进口机器尝试两种不同的方法:
__all__
;如果定义了它,它必须是要导入的名称字符串列表。在__all__
未定义,则取__dict__
属性的键,过滤掉以下划线开头的名称。在因为您的
b
模块没有定义__all__
列表,所以取而代之的是__dict__
键。对于针对模块指定的MagicMock
实例,__dict__
属性只由带有_
下划线的名称和mock_calls
属性组成。from b import *
仅进口mock_calls
:我强烈建议不要嘲笑整个模块;这样做将要求您推迟导入
a
,而且很脆弱。修补程序是永久的(测试结束时不会自动撤消),并且不支持重复运行测试或以随机顺序运行测试。在但是,如果有来实现这一点,您可以首先向mock添加一个
^{pr2}$__all__
属性:就个人而言,我应该避免使用
from module import *
语法。如果我无论如何都不能阻止它被使用,下一步就是在导入之后对a
应用补丁,在b
模块上循环以获得指定的替换:这使
sys.modules['b']
保持不变,并处理from *
将加载的相同名称。测试结束后,补片再次被移除。在以上测试输出:
相关问题 更多 >
编程相关推荐