【问题标题】:Assert call to method using Mock python使用 Mock python 断言对方法的调用
【发布时间】:2017-05-11 10:24:20
【问题描述】:

我正在尝试使用 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 mocking


    【解决方案1】:

    如果你修补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()
    

    【讨论】:

    • 我收到 AttributeError: exit
    • 你是在使用 mock 模块还是在制作 Mock()?为此,您只需要import mock
    • 不要制作 Mock 对象,只需导入 mock
    • Sionide,我设法通过使用模拟来完成测试。现在我对其中一种方法有疑问。如果方法a已经被导入,那么如何完成patch?
    • Sionide,我试过了。我有一个这样的导入:from xyz import abc 我试过这个:with mock.patch('xyz.abc.a') as fake
    【解决方案2】:

    不知怎么的,我觉得mymock.b()跟方法b()没有关系,这能做什么呢?

    你是对的。当你模拟一个对象时,你暗示你不关心你的模拟在幕后做了什么。如果你想确保 a 是从 b 调用的,你需要在 b 中调用 patch a

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

    【讨论】:

    • 我已将此代码与您在上面发布的内容一起使用(唯一的区别是我将 some condition 替换为 True:)。它运行没有错误。如果您遇到错误,请编辑您的问题并发布给您带来麻烦的实际代码和堆栈跟踪。如果没有这些信息,我将无法帮助您进行故障排除。
    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 2012-08-24
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多