gpt4 book ai didi

python - 监视类实例化和方法

转载 作者:行者123 更新时间:2023-12-05 03:05:46 26 4
gpt4 key购买 nike

我希望能够看到类是如何实例化的,我希望看到该类的方法是如何使用的。我可以实现第一个目标,但是,下面的代码演示了我如何无法监视方法调用。最终断言失败。

import mock

class A:
def __init__(self, some_arg):
print("constructor")

def f(self, some_var):
print(some_var)

p = mock.patch('__main__.A', wraps=A)
m = p.start()
A = m
a = A('something')
a.f('my_arg')
assert mock.call('something') in m.mock_calls
assert m.method_calls # This fails, call to f is not tracked

如果我使用 autospec=True,我可以看到方法调用,但实际的方法并没有被调用。我想要实际代码运行,我只想监视它。

我不能做类似 http://wesmckinney.com/blog/spying-with-python-mocks/ 的事情因为我没有该类的实例。

最佳答案

https://stackoverflow.com/a/41599695/9816369有一个非常可靠的解决方案。由此,我可以这样做:

import mock


def spy_decorator(method_to_decorate):
m = mock.MagicMock()
def wrapper(self, *args, **kwargs):
m(*args, **kwargs)
return method_to_decorate(self, *args, **kwargs)
wrapper.mock = m
return wrapper


class A:
def __init__(self, some_arg):
print("constructor")

def f(self, some_var):
print(some_var)


construct_spy = spy_decorator(A.__init__)
f_spy = spy_decorator(A.f)
p_construct = mock.patch('__main__.A.__init__', construct_spy)
p_f = mock.patch('__main__.A.f', f_spy)

m_construct = p_construct.start()
m_f = p_f.start()

a = A("hi")
a.f("car")

m_construct.mock.assert_called_once_with("hi")
m_f.mock.assert_called_once_with("car")

它可能会更好一些,但它非常可靠。我还应该提到有 https://github.com/beanbaginc/kgb但我不想修改我正在使用的需求文件。

关于python - 监视类实例化和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50427397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com