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()
方法)。