未直接调用的Python模拟功能

斯蒂芬·怀特

在我的对象中,我具有多个“加载程序”功能,用于可能需要加载的不同类型的数据。它们存储为:

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作为测试引擎,但是我发现它过去可以与模拟游戏很好地配合使用。

谢谢!

gold_cy

之所以出现此问题,是因为您试图修补属性(而不是实例属性)中的函数行为是不一样的。但是,这确实为我们提供了一些灵活性,因为它是属性,因此我们可以直接在测试中实例化的类上修改对象。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

未直接调用的Python模拟功能

来自分类Dev

未直接调用的Python模拟功能

来自分类Dev

python模拟函数未调用

来自分类Dev

未调用模拟方法

来自分类Dev

协议功能未调用

来自分类Dev

链接功能未调用

来自分类Dev

信号功能未调用

来自分类Dev

用Java模拟功能接口调用

来自分类Dev

在导入时调用模拟功能

来自分类Dev

酶异步等待不调用模拟功能

来自分类Dev

用Java模拟功能接口调用

来自分类Dev

停止访问直接功能或URL调用

来自分类Dev

Mockito中未调用的模拟方法

来自分类Dev

GMock死亡案例-未调用模拟函数

来自分类Dev

Laravel部分模拟模型未调用

来自分类Dev

Python:建立模拟功能的问题

来自分类Dev

Python模拟错误:在未启动的修补程序上停止调用

来自分类Dev

python正确模拟了一个函数,但是未考虑调用计数

来自分类Dev

PowerMock模拟静态未捕获模拟的静态void方法调用

来自分类Dev

为什么在执行模拟方法时未调用模拟通知?

来自分类Dev

模拟器上调用了abstractButtonTappedForRow,但设备未调用

来自分类Dev

放置取消分配功能未调用

来自分类Dev

为什么未调用功能意外?

来自分类Dev

角路由配置功能未调用

来自分类Dev

成功的ajax调用未返回成功功能

来自分类Dev

成员函数调用引发未实现的功能

来自分类Dev

角路由配置功能未调用

来自分类Dev

某些功能调用未显示在VTune中

来自分类Dev

按钮未正确调用功能