我是单元测试的新手,我正在尝试使用 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([...])
现在,一旦你调试了问题,你可以删除最后两个语句,因为它们不会增加你的测试覆盖率,并且你的代码更难维护。