使用模拟python断言对方法的调用
我正在尝试使用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()无
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:
)。它运行正常。如果您遇到错误,请编辑您的问题,并发布给您带来麻烦的实际代码和堆栈跟踪。没有这些信息,我无法帮助您解决问题。