您能给出在Django单元测试中使用Mock()的一些清晰实例吗?我想更加清楚地了解它。
更新:我已经弄清楚了一些东西,因此在下面分享。
您能给出在Django单元测试中使用Mock()的一些清晰实例吗?我想更加清楚地了解它。
更新:我已经弄清楚了一些东西,因此在下面分享。
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'
看,我们成功地覆盖了这个方法。
Mock网站有非常好的API文档,涵盖了所有这些内容。请注意,patch将替换所有调用foo.Foo.foo
的实例,无论它们在哪里被调用。这不是模拟某些东西的首选方式,但可能是唯一的方式--请参见open()。