设置特定参数调用时模拟方法的返回值

0 投票
1 回答
4449 浏览
提问于 2025-04-18 18:27

我有一个测试,它是通过模拟网络服务来工作的。我设置了一个特定的方法,当它被调用时会返回一个特定的值。我在验证这个被包装的函数是否返回我期望的值。不过,问题是这个测试看起来几乎没什么用。

这是我现在的代码 -

@patch('run.Client')
def test(self, mock_client):
    service = WebService()
    mock_client.return_value.service.GetMemberStatus.return_value = 'E'
    member_status = service.get_member_status(11)
    self.assertEqual('E', member_status)

我想要做的是,只有在调用GetMemberStatus方法时,传入特定的参数,才返回E。我尝试过这样做 -

mock_client.return_value.service.GetMemberStatus(11, '', '').return_value = 'E'

但是这似乎没有任何改变。

问题是 - 我该如何设置一个模拟的方法的返回值,只有在用合适的参数调用时才返回?

1 个回答

3

一般来说,你不需要这样做。你应该在测试中确认你的模拟方法是否用预期的参数被调用:

gms_mock = mock_client.return_value.service.GetMemberStatus
gms_mock.return_value = 'E'

member_status = service.get_member_status(11)

self.assertEqual('E', member_status)
gms_mock.assert_called_with(11, '', '')

你所做的只是记录了一次模拟调用,就好像被测试的代码调用了 GetMemberStatus,然后把 'E' 赋值给了那个模拟实例的 return_value 属性。

可以side_effect 属性 设置为一个函数;这样它会接收参数,你可以在这里进行测试:

def gms_mock_call(*args):
    assert args == (11, '', '')
    return 'E'

mock_client.return_value.service.GetMemberStatus.side_effect = gms_mock_call

但是这样做其实把测试参数传递的地方搞错了。

撰写回答