使用模拟python断言对方法的调用

使用模拟python断言对方法的调用,python,mocking,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()无

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

如果您修补
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()
不知何故,我认为mymock.b()与方法b()无关。对此可以做些什么

你说得对。当你模拟一个对象时,你暗示你不在乎你的模拟在幕后做什么。如果要确保从
b
调用
a
,则需要在
b
中调用
a

>>> from mock import patch
>>> with patch('__main__.a') as patch_a:
...     b()
...     patch_a.assert_called_with()
因此,这个故事的寓意是,在你想要测量的对象上进行模拟或修补,而不实际调用,而不是你关心其实现的对象。在本例中,您关心
b
,希望了解它如何使用
a
。因为我们不关心
a
做什么,只关心它被调用,所以我们可以对它进行修补


此外,如果您想了解有关调用的更多详细信息,而不是使用对调用的调用进行断言,则可以通过访问补丁程序的模拟调用属性来分析所有调用。在这种情况下,将是
patch\u a.mock\u调用

我正在获取AttributeError:Exitar您是否使用mock模块或制作mock()?为此,您只需
导入mock
不要创建mock对象,只需导入mockSionide,我通过使用mock成功地完成了测试。现在我有一个关于其中一种方法的问题。如果方法a已经被导入,那么如何完成补丁呢。我有一个类似这样的导入:从xyz导入abc我尝试了这个:使用mock.patch('xyz.abc.a')作为fakeI,我已经将此代码用于您上面发布的内容(唯一的区别是我将
某些条件
替换为
True:
)。它运行正常。如果您遇到错误,请编辑您的问题,并发布给您带来麻烦的实际代码和堆栈跟踪。没有这些信息,我无法帮助您解决问题。