使用mock模拟嵌套属性

Ole*_*siy 8 python unit-testing nested properties mocking

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

r = Foo(x,y)
Run Code Online (Sandbox Code Playgroud)

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

>> 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'
Run Code Online (Sandbox Code Playgroud)

我不太关心中间性质.

有没有一种优雅的方式来模拟嵌套属性与mock

dbn*_*dbn 15

像您期望的那样替换模拟对象的属性调用:

>> 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'
Run Code Online (Sandbox Code Playgroud)

这样可以在定义特定值时充分发挥模拟功能.