在我的对象中,我具有多个“加载程序”功能,用于可能需要加载的不同类型的数据。它们存储为:
import foo
import bar
class MyClass
LOADERS = {
'foo': {
'context_manager': False,
'func': foo.data.loader,
'kwargs': {'data_orientation': 'columns'}
},
'bar': {
'context_manager': True,
'func': bar.load_data
'kwargs': {}
}
}
def load_data(self, load_type, path):
func = self.LOADERS[load_type]['func']
kwargs = self.LOADERS[load_type]['kwargs']
if self.LOADERS[load_type]['context_manager']:
with open(path, 'rb') as f:
self.data=func(f, **kwargs)
else:
self.data = func(path, **kwargs)
这在实践中效果很好,但是我发现测试是谋杀的。
当我编写测试时:
from mock import MagicMock, patch
import sys
sys.modules['foo'] = MagicMock()
sys.modules['bar'] = MagicMock()
from mypackage import MyClass
@patch('foo.data.loader')
def test_load_foo(mock_loader):
my_obj = MyClass()
my_obj.load_data('foo', 'path/to/data')
mock_loader.assert_called_once()
它失败。叫了0次。
我中途怀疑这是因为没有直接调用它。但这并不重要。
谁能提供任何建议?我使用pytest作为测试引擎,但是我发现它过去可以与模拟游戏很好地配合使用。
谢谢!
之所以出现此问题,是因为您试图修补类属性(而不是实例属性)中的函数。行为是不一样的。但是,这确实为我们提供了一些灵活性,因为它是类属性,因此我们可以直接在测试中实例化的类上修改对象。
from unittest.mock import MagicMock
from mypackage import MyClass
def test_load_foo():
key_to_test = "foo"
mock_loader = MagicMock()
my_obj = MyClass()
my_obj.LOADERS[key_to_test]["func"] = mock_loader
my_obj.load_data(key_to_test, 'path/to/data')
mock_loader.assert_called_once()
而不是尝试修补功能,我们修改对象实例以使用MagicMock
。
使用这种方法,我收到以下消息:
collected 1 item
tests/test_mypackage.py . [100%]
======================================================================= 1 passed in 0.01s =======================================================================
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句