在Python中使用Mock()

Kee*_*Kee 8 python unit-testing mocking

你能给出一些在Django单元测试中使用Mock()的明确例子吗?我想更清楚地理解它.

更新:我已经找到了一些东西,所以我在下面分享.

Kee*_*Kee 16

第1部分:基础知识

from mock import Mock
Run Code Online (Sandbox Code Playgroud)

模拟对象是一种对象,它是Dummy我们想要不执行的代码的一种,但我们想知道一些信息(调用次数,调用参数).我们也可能想为该代码指定返回值.

让我们定义简单的功能:

def foo(value):
    return value + value
Run Code Online (Sandbox Code Playgroud)

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

mock_foo = Mock(foo, return_value='mock return value')
Run Code Online (Sandbox Code Playgroud)

现在我们可以检查一下:

>>> foo(1)
2
>>> mock_foo(1)
'mock return value'
Run Code Online (Sandbox Code Playgroud)

并获得有关电话的一些信息:

>>> mock_foo.called
True
>>> mock_foo.call_count
1
>>> mock_foo.call_args
((1,), {})
Run Code Online (Sandbox Code Playgroud)

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    
Run Code Online (Sandbox Code Playgroud)

他们是不言自明的.

第2部分:@patch装饰者

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

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

class Foo(object):
    def foo(value):
        return value + value
Run Code Online (Sandbox Code Playgroud)

让我们为@patch装饰器编写一个测试.我们将从模块foo中修改类中的方法.别忘了进口.Foofoo

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)
Run Code Online (Sandbox Code Playgroud)

现在运行它:

>>> test()
'mock return value'
Run Code Online (Sandbox Code Playgroud)

瞧!我们的方法成功覆盖了.

  • 啊,最后解释一下我能理解的模拟和补丁! (3认同)