使用Mock python断言调用方法

时间:2012-04-09 19:30:38

标签: python mocking

我正在尝试使用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()无关。可以做些什么?

2 个答案:

答案 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