设置特定参数调用时模拟方法的返回值
我有一个测试,它是通过模拟网络服务来工作的。我设置了一个特定的方法,当它被调用时会返回一个特定的值。我在验证这个被包装的函数是否返回我期望的值。不过,问题是这个测试看起来几乎没什么用。
这是我现在的代码 -
@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
但是这样做其实把测试参数传递的地方搞错了。