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