Python-模拟对象';具有多个值的属性?

Python-模拟对象';具有多个值的属性?,python,unit-testing,python-3.x,testing,mocking,Python,Unit Testing,Python 3.x,Testing,Mocking,我有一个对象方法,它可以更改对象的属性。另一个方法(我正在尝试测试的方法)多次调用第一个方法,然后使用修改过的属性。在明确说明第一个方法如何更改该属性的同时,如何测试第二个方法 例如: def method_to_test(self): output = [] for _ in range(5): self.other_method() output.append(self.attribute_changed_by_other_method)

我有一个对象方法,它可以更改对象的属性。另一个方法(我正在尝试测试的方法)多次调用第一个方法,然后使用修改过的属性。在明确说明第一个方法如何更改该属性的同时,如何测试第二个方法

例如:

def method_to_test(self):
    output = []
    for _ in range(5):
        self.other_method()
        output.append(self.attribute_changed_by_other_method)
    return output
我想指定由于
其他方法
而改变的
属性
将变成的一些特定值(而真正的
其他方法
使用概率来决定如何改变
其他方法改变的属性


我猜最好的方法是“模拟”属性
属性通过其他方法改变,这样每次读取该值时,它都会返回一个不同的规范值。但我似乎找不到该怎么做。我看到的另一个选项是确保每次都模拟
other_method
以定义的方式更新属性,但我不知道有什么特别干净的方法可以做到这一点。有人能提出一个合理的解决方法吗?非常感谢。

您实际上可以使用
其他方法。使用flexmock可以在类的实例上设置一个mock。下面是一个如何使用它的示例:

class MyTestClass(unittest.TestCase):
    def setUp(self):
        self.my_obj = MyClass()
        self.my_obj_mock = flexmock(self.my_obj)

    def my_test_case(self):
        self.my_obj_mock.should_receive('other_method').and_return(1).and_return(2).and_return(3)
        self.my_obj.method_to_test()
因此,这里发生的是,在您的
MyClass
实例上,您正在用
self.my_obj
创建一个flexmock对象。然后在您的测试用例中,您声明当您调用
方法\u to \u test
时,您应该收到
其他\u方法
,并且每次调用它都应该分别返回
1、2、3

此外,如果您仍有兴趣了解如何模拟通过其他方法改变的属性,您可以使用模拟:


希望这有帮助。让我知道进展如何

对于仍在寻找直截了当答案的人来说,正如公认的答案所示,使用
PropertyMock
可以轻松做到这一点。这里有一种方法

来自unittest.mock导入修补程序,PropertyMock
使用补丁(“方法\u您的\u类\u或\u方法\u调用”,new\u callable=PropertyMock)作为mock\u调用:
模拟呼叫副作用=[111222]
类或方法()

随后对该修补方法的每次调用都将按顺序返回该列表。

PropertyMock为我找到了我想要的内容(使用您为其发布的链接中给出的
type()
方法)。