在子对象中模拟 return 值

Mocking a return value in a sub object

我想为复杂数据结构中的功能编写测试用例。该功能不依赖于所有数据,并且很难获得具有所需属性的真实实例。因此,我正在使用模拟。

def test_Case:
    t1 = Timeseries(...) # Data
    t2 = Timeseries(...) # Data

    fancy_t1 = Mock(data=d1, additional_property= ...)
    fancy_t2 = Mock(data=d2, additional_property= ...)

    container = Mock(data_sets=[fancy_t1, fancy_t2])

    ret = function_to_test(container)
    assert ret ... # Some condition

function_to_test 中有一个形式为

的调用
container.aggregation.aggregate(fancy_t, more_arguments1, more_arguments2, ... )

我希望 aggregation.aggregate 调用执行的操作非常简单。它应该评估为 t1+t2 (时间序列)并忽略 fancy_t 和其他参数。

我该怎么做?

如果我这样做

agg = Mock()
agg.return_value = d1 + d2
container.aggregation.get_aggregated_positions = agg

它评估为 <Mock name='mock.aggregation.get_aggregated_positions()' id='296569680'> 而不是时间序列。

类似的东西有效:

from mock import patch

with patch('package.container.aggregation.get_aggregated_positions', return_value=_fake_fnc()):
   ret = function_to_test(container)
   assert ret ... # Some condition

def _fake_fnc():
   return 0.0