用模拟嘲笑嵌套的属性 [英] Mocking nested properties with mock

查看:58
本文介绍了用模拟嘲笑嵌套的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个返回对象的函数调用:

I have a function call that returns an object:

r = Foo(x,y)

其中,r具有一组丰富的嵌套属性.例如,我可以访问r.prop_a.prop_b.prop_c.我想模拟Foo,以便修改r的特定叶子属性,即,使r.prop_a.prop_b.prop_c返回我控制下的值:

where r has a rich set of nested properties. For example, I can access r.prop_a.prop_b.prop_c. I would like to mock Foo, such that a specific leaf property of r is modified, i.e. such that r.prop_a.prop_b.prop_c returns a value under my control:

>> r = Foo(x,y)
>> r.prop_a.prop_b.prop_c
'fish'
>> # some mock magic patching of Foo is taking place here
>> r = Foo(x,y)
>> r.prop_a.prop_b.prop_c
'my_fish'

我不太在乎中间属性.

I do not care about intermediate properties much.

是否存在使用 mock ?

推荐答案

按预期替换模拟对象的属性调用:

Replace the mock object's attribute call as you would expect:

>> r1 = r_original(x, y)
>> r1.prop_a.prop_b.prop_c
'fish'

>> returner = mock.MagicMock()
>> returner.prop_a.prop_b.prop_c = 'fish'
>> r_mocked = mock.MagicMock(spec_set=r_original, return_value=returner)
>> r2 = r_mocked(x, y)
>> r2.prop_a.prop_b
MagicMock name='returner.prop_a.prop_b' id='87412560'>
>> r2.prop_a.prop_b.prop_c
'fish'

这使您可以在定义特定值时进行模拟的全部功能.

This allows you the full power of mocking while defining a specific value.

这篇关于用模拟嘲笑嵌套的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆