使用带有contextlib.nested的模拟patch.object时如何返回多个值

时间:2016-01-28 10:02:45

标签: unit-testing mocking python-unittest python-mock

我是单元测试的新手,我正在尝试使用patch.object编写单元测试来模拟函数调用。模拟函数getObj()在我测试的函数中被调用两次。第一次被叫我期待Nonereturn_value,第二次我期待some_string。我不知道怎么做。

代码如下:

def test_create(self):
    with contextlib.nested(
        patch.object(agent, 'try_connect',
        patch.object(util, 'get_obj', return_value = None),
        ) as (mock_try_connect, mock_get_obj):
        proxy_info = self.util.create(data)

我尝试使用side_effects,并将其作为return_value的输入,但每次返回None

mock_value=Mock()
mock_value.side_effect = [None, 'some_string']
patch.object(util, 'get_obj', return_value = mock_value())

1 个答案:

答案 0 :(得分:0)

使用assert_has_calls来验证模拟对象的调用方式与您预期的调用完全相同。这有助于您调试问题。

def test_create(self):
    with contextlib.nested(
            patch.object(agent, 'try_connect',
            patch.object(util, 'get_obj', side_effect = [None, 'some_string']),
            ) as (mock_try_connect, mock_get_obj):
        proxy_info = self.util.create(data)
        mock_try_connect.assert_has_calls([mock.call(#params), ...])
        mock_get_obj.assert_has_calls([...])

现在,一旦调试完问题,您就可以删除最后两个语句,因为它们不会为您的测试覆盖率添加任何内容,并使您的代码难以维护。

相关问题