在Python中使用Mock()

11

您能给出在Django单元测试中使用Mock()的一些清晰实例吗?我想更加清楚地了解它。

更新:我已经弄清楚了一些东西,因此在下面分享。

2个回答

21

第一部分:基础知识

from mock import Mock

Mock对象是一种对象,它类似于代码中的“虚拟对象”,我们不希望执行该对象,但我们想知道关于该对象的一些信息(调用次数、调用参数)。此外,我们可能还想为该代码指定返回值。

让我们定义一个简单的函数:

def foo(value):
    return value + value

现在我们已经准备好为它创建一个Mock对象:

mock_foo = Mock(foo, return_value='mock return value')

现在我们可以进行检查:

>>> foo(1)
2
>>> mock_foo(1)
'mock return value'

获取一些关于调用的信息:

>>> mock_foo.called
True
>>> mock_foo.call_count
1
>>> mock_foo.call_args
((1,), {})

Mock()实例可用的属性包括:

call_args       func_code       func_name
call_args_list  func_defaults   method_calls
call_count      func_dict       side_effect
called          func_doc        
func_closure    func_globals    

它们相当自我解释。

第二部分:@patch装饰器

@patch 装饰器使我们可以轻松地为导入的对象(类或方法)创建模拟对象。在编写单元测试时非常有用。

假设我们有以下模块 foo.py:

class Foo(object):
    def foo(value):
        return value + value

让我们为@patch装饰器编写一个测试。 我们将在模块foo中的Foo类的方法foo中打补丁。不要忘记导入。

from mock import patch
import foo

@patch('foo.Foo.foo')
def test(mock_foo):
    # We assign return value to the mock object
    mock_foo.return_value = 'mock return value'
    f = foo.Foo()
    return f.foo(1)

现在运行它:

>>> test()
'mock return value'

看,我们成功地覆盖了这个方法。


5
啊,终于有一篇关于Mock和Patch的解释我可以理解了! - Rusty Rob

1

Mock网站有非常好的API文档,涵盖了所有这些内容。请注意,patch将替换所有调用foo.Foo.foo的实例,无论它们在哪里被调用。这不是模拟某些东西的首选方式,但可能是唯一的方式--请参见open()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接