在自定义函数包装器中使用 __qualname__ 会导致 pytest-mock 因 AttributeError 失败

问题描述

我有一个 python 包装函数

def my_wrapper(func: Callable):

    @functools.wraps(func)
    def wrapped_function(*args,**kwargs):
        # do something
        value = func(*args,**kwargs)
        print(f"some log containing'{func.__qualname__}'")
        return value

    return wrapped_function

我使用这个包装器来记录一些关于带注释函数输出。 我是这样用的:

    def some_method(**kwargs):
        # do something
        some_object.fit = my_wrapper(some_object.fit)
        some_object.fit(**kwargs)

到目前为止,一切都很好,就像一个魅力。 some_object.fit 被执行并按预期记录输出

但是,接下来,我想使用 pytest-mock 编写一些测试,因为 some_object.fit 很慢,我想模拟它:

    def test_some_method(self,mocker):
        new_fit = mock.create_autospec(new_fit)
        mocker.patch('some.class.fit') # note,that some_object before was of type some.class
        some_method()
        some.class.fit.assert_called_once_with()

这在 some_method() 上失败(下面的错误消息),但是一旦我取消注释我在第二个代码块中包装 fit 方法的行,它就会很好地工作。

错误消息表明,__qualname__ 可能未移植并因此导致问题,但我不知道如何解决此问题:

self = <Magicmock name='fit' id='2071529901192'>,name = '__qualname__'

    def __getattr__(self,name):
        if name in {'_mock_methods','_mock_unsafe'}:
            raise AttributeError(name)
        elif self._mock_methods is not None:
            if name not in self._mock_methods or name in _all_magics:
                raise AttributeError("Mock object has no attribute %r" % name)
        elif _is_magic(name):
>           raise AttributeError(name)
E           AttributeError: __qualname__

[project environment]\lib\unittest\mock.py:601: AttributeError

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...