有没有办法让Mock()返回与调用参数相关的不同对象?

2024-06-11 14:56:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有此代码要测试(简化):

def foo(job):
    stop1 = job.stops.get(stop_number=1)
    stop1.departed_at = first_scan['scan_date']
    stop2 = job.stops.get(stop_number=2)
    stop2.pod_time = pod['received_date']

所以我是这样做的:

    job = Mock()
    foo(job)
    self.assertIsInstance(job.sync_at, datetime.datetime)
    self.assertAlmostEqual(job.booked_at, isoformat('2019-10-01T00:00:00'))
    self.assertAlmostEqual(job.stops.get(stop_number=1).departed_at, isoformat('2019-10-07T05:24:47'))
    self.assertAlmostEqual(job.stops.get(stop_number=2).pod_time, isoformat('2019-10-07T12:00:00'))

问题是job.stops.get方法返回具有任何参数值的相同对象:

>>> job.stops.get(stop_number=1)
<Mock name='mock.stops.get()' id='140194394261936'>
>>> job.stops.get(stop_number=2)
<Mock name='mock.stops.get()' id='140194394261936'>
>>> 

因此,在测试上述代码时,我让job.stops.get(stop_number=1)job.stops.get(stop_number=2)返回相同的输出,同时设置了departed_atpod_time属性。因此,我不确定pod_time是否设置为stop2而不是stop1,反之亦然

问题是如何使mock返回与stop_number值相关的不同的实例


Tags: selfnumbergettimejobmockatpod
1条回答
网友
1楼 · 发布于 2024-06-11 14:56:01

您可以为Mock对象的^{}属性分配一个可调用属性。使可调用函数根据不同的输入参数返回不同的对象:

def mock_get(stop_number):
    return {
        1: Mock(departed_at='2019-10-07T05:24:47'),
        2: Mock(pod_time='2019-10-07T12:00:00')
    }[stop_number]

job = Mock()
job.stops.get.side_effect = mock_get
foo(job)
assert job.stops.get(stop_number=1).departed_at == '2019-10-07T05:24:47' # passes
assert job.stops.get(stop_number=2).pod_time == '2019-10-07T12:00:00' # passes

相关问题 更多 >