3

我有一堂这样的课。

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'的自我属性时(使用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”?

4

1 回答 1

4

该类没有该属性,您将其设置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)
于 2020-09-01T02:49:12.143 回答