我通过模拟Web服务进行测试。我有它在调用特定方法时返回特定返回值的位置。我正在验证包装函数返回我期望的值。问题是测试似乎几乎没用。
这就是我所拥有的 -
@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)
如果使用特定参数调用E
方法,我要做的只是返回GetMemberStatus
。我试过 -
mock_client.return_value.service.GetMemberStatus(11, '', '').return_value = 'E'
然而,这似乎没有任何改变。
问题 - 如果使用适当的参数调用,如何设置模拟方法返回值?
答案 0 :(得分:2)
一般来说,你不是。您改为断言已使用预期参数调用模拟方法作为测试的一部分:
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
上分配了Mock
该调用返回的实例。
您可以将side_effect
attribute设置为函数;它将被传递参数,你可以在那里测试:
def gms_mock_call(*args):
assert args == (11, '', '')
return 'E'
mock_client.return_value.service.GetMemberStatus.side_effect = gms_mock_call
但这确实会测试在错误的位置传递什么参数。