我正在尝试使用Python中的模拟库进行一些单元测试。我有以下代码:
def a():
print 'a'
def b():
print 'b'
if some condition
a()
如果对b
进行模拟调用时,如何声明已调用b
?我尝试了以下代码,但它失败了:
mymock=Mock()
mymock.b()
assertTrue(a.__call__ in mymock.mock_calls)
出于某种原因,我认为mymock.b()
与方法b()
无关。可以做些什么?
答案 0 :(得分:7)
如果你修补a
,你可以确保它被调用如下:
with mock.patch('__main__.a') as fake_a:
b()
fake_a.assert_called_with()
如果您的方法位于不同的模块中:
import mymodule
with mock.patch('mymodule.a') as fake_a:
mymodule.b()
fake_a.assert_called_with()
答案 1 :(得分:3)
不知何故,我认为mymock.b()与方法b()无关。可以为此做些什么?
你是对的。当你嘲笑一个物体时,你暗示你并不关心你的模拟在幕后做什么。如果您想确保a
来自b
,则需要a
中的patch b
。
>>> from mock import patch
>>> with patch('__main__.a') as patch_a:
... b()
... patch_a.assert_called_with()
因此,故事的寓意是,模拟或修补您想要在不实际调用的情况下测量的对象,而不是您关心其实现的对象。在这种情况下,您关心b
,并希望了解它如何使用a
。由于我们并不关心a
所做的事情,只关注它被调用,我们可以修改它。
此外,如果您想了解有关对a的调用的更多详细信息,而不是assert_called_with
,则可以通过访问修补程序mock_calls
属性来分析所有调用。在这种情况下,它将是patch_a.mock_calls
。