5

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

4

2 回答 2

7

如果你 patch 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()
于 2012-04-09T19:40:42.147 回答
3

不知何故,我认为 mymock.b() 与方法 b() 无关,对此可以做什么?

你是对的。当你模拟一个对象时,你暗示你不关心你的模拟在幕后做了什么。如果您想确保它a是从 调用的,b您需要修补 a.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可以通过访问 patchmock_calls属性来分析所有调用。在这种情况下,它会是patch_a.mock_calls

于 2012-04-09T19:43:43.160 回答