如何在pytest中猴子修补类实例变量

问题描述 投票:0回答:2

我有一个类,其中有一个变量

__init__
和一个方法。该变量存储表示 s3 存储桶名称的字符串值,该方法将使用该名称。

class Manage:
    def __init__(self):
        self.bucket = 'doc'

    def read_file(self):
        bucket = self.bucket
        ...
        return file

我正在编写一个测试用例来测试该方法,但问题是我想使用不同的存储桶,所以我想修补该变量的值。

我尝试过的代码

import Manage

def test_manage(monkeypath):
   monkeypath.setattr(Manage, 'bucket', 'doc2')
   ...

上面的代码不起作用,因为存储桶不是类级变量(我猜)。我不知道该怎么改变

python-3.x pytest monkeypatching
2个回答
0
投票

正如@gold_cy所建议的,您可以在实例化对象后设置它:

import Manage

def test_manage():
    manage = Manage()
    manage.bucket = 'doc2'
   ...

0
投票

它不起作用,因为您设置了类“管理”的属性,而不是实例。如果您访问 Manage.bucket,您将看到模拟值。 如果您不想安装其他依赖项(如pytest-mock),您可以使用以下解决方法:

monkeypatch.setattr(Manage, "bucket",
                    property(lambda self: "doc2"))

它创建一个实例方法,然后该方法转向一个属性,您将获得该属性返回的值。有点老套,但有效。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.