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

时间:2014-08-25 14:28:00

标签: python unit-testing python-3.x mocking

我通过模拟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'
然而,这似乎没有任何改变。

问题 - 如果使用适当的参数调用,如何设置模拟方法返回值?

1 个答案:

答案 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

但这确实会测试在错误的位置传递什么参数。