当我在模块中测试 python 类时,我正在烦恼一些模拟,我在下面提供了一个示例
虽然我有这样的模块结构:
mock_example/
source/
module_A/
__init__.py
A.py
test/
__init__.py
test_a.py
假设
module_A
包含具有 A 类定义的 A.py
:
from robot.libraries.BuiltIn import BuiltIn # some external module
class A:
def __init__(self):
self._some_attribute = BuiltIn()
def some_method(self, variable_name):
return self._some_attribute.get_variable_value(variable_name)
但是 module_A 的 init.py 通过内部设置缩小了命名空间:
from source.module_A.A import A
我只是想在
test/
位置测试 A 类。
在类构造函数中,您可以看到我的一些属性被分配给外部模块的导入类,并且正在导入实例。我感兴趣的是如何模拟在 A 类构造函数中分配的外部模块,但使用这样的
__init__.py
文件,因此外部模块中的类实例不会被创建并且会被模拟。如果我的 __init__.py
的 module_A
只允许导入 A
类,是否有可能?
问题
我怎样才能在
_some_attribute
中嘲笑A的test_a.py
:
from mock import Mock
def test_a_class_instance():
instance = A()
instance
不会创建实例BuiltIn
但它会被嘲笑属性?
我尝试了什么?
我一直在尝试通过扰乱 sys.modules 来全局模拟外部
BuiltIn
模块:
import sys
import types
from mock import Mock
module_name = 'robot.libraries.BuiltIn'
module_mock = types.ModuleType(module_name)
sys.modules[module_name] = module_mock
builtin_mock = Mock()
builtin_ctor_mock = Mock(name=module_name + '.BuiltIn', return_value=builtin_mock)
module_mock.BuiltIn = builtin_ctor_mock
然后将其导入到
test_a.py
中,使用 import over class import 进行测试,但没有任何运气。
我能看到模拟这个的唯一方法是创建
BuiltIn
实例,然后用模拟覆盖它或完全删除 __init__.py
目录中 module_A
的内容,但我不想只干预源代码因为我被mock咬了:)
任何提示将非常受欢迎!
使用外部依赖项进行单元测试的模式是,将依赖项作为构造函数参数传递,如果它为 null (
None
),则在构造函数内对其进行初始化。这使您能够通过您想要预配置的任何行为从单元测试中传递此依赖项的模拟。