在自定义函数包装器中使用 __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 (将#修改为@)