gpt4 book ai didi

python - 如何使用pytest模拟类属性

转载 作者:行者123 更新时间:2023-12-04 13:12:26 25 4
gpt4 key购买 nike

我有一个类似这样的类。

class Upgrade:

def __init__(self, ssh_client):
self.ssh_client = ssh_client
self.channel = self.ssh_client.invoke_shell(width=1000, height=1000)
self.stdin = self.channel.makefile('wb')
self.stdout = self.channel.makefile('r')


def do_upgrade(self):

# execute some commands on paramiko channel

for line in self.stdout:

if str(line).startswith("PLAY RECAP"):

# do something

当我尝试像这样模拟名为“stdout”的 self 属性时(使用 pytest),

def return_stdout(*args, **kwargs):
stdout = "\n\rSome return value\n\r"
return stdout
monkeypatch.setattr(Upgrade, 'stdout', return_stdout)

我遇到以下错误。

>     monkeypatch.setattr(Upgrade, 'stdout', return_stdout)
E AttributeError: <class 'Upgrade'> has no attribute 'stdout'

那么,如何使用 pytest 或 pytest-mock 模拟“stdout”?

最佳答案

没有该属性,您将stdout 设置为实例 变量。即使您模拟它,您也会在构造函数中覆盖它 (self.stdout = self.channel.makefile('r'))。创建一个包装器/属性,然后用 monkeypatch 代替:

class Upgrade:
def __init__(self, ssh_client):
self._stdout = self.channel.makefile('r')

def get_stdout(self):
return self._stdout

然后在测试中模拟封装方法:

monkeypatch.setattr(Upgrade, 'get_stdout', return_stdout)

关于python - 如何使用pytest模拟类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63680442/

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