如何在将mock patch.object与contextlib.nested一起使用时返回多个值



我是单元测试的新手,我正在尝试使用 patch.object 编写单元测试来模拟函数调用。模拟函数getObj()在我正在测试的函数中被调用两次。第一次当它被召唤时,我期待着None return_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())

使用 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([...])

现在,一旦你调试了问题,你可以删除最后两个语句,因为它们不会增加你的测试覆盖率,并且你的代码更难维护。

最新更新