模拟对象旨在快速轻松地表示一些复杂对象,而无需在测试期间手动检查并设置该对象的存根。它只是一个有用的实用程序,可以使编写测试更容易一些。
至于要模拟的内容/位置,应模拟被测模块外部的任何内容。您要测试的只是当前模块代码,而不是被测模块正在调用的某些模块的代码。
一个简单的例子是一些使用 simplejson 模块的代码。
import simplejson
def my_fn(args):
return simplejson.dumps({'args': args})
您要测试的只是函数 my_fn 对 simplejson.dumps() 进行了正确调用,因此您可以模拟 simplejson。您并不真正关心传递给 simplejson 的对象是否被正确转换为 json 作为在 simplejson 模块范围内的测试(如果您愿意,它有自己的一组测试,您可以运行这些测试)。
import working_code
import mock
@mock.patch('working_code.simplejson')
def test_my_fn(mock_simplejson):
working_code.my_fn('test-args')
mock_simplejson.dumps.assert_called_with({'args': 'test-args'})
请注意,mock.patch 只是为特定测试注入和删除模拟的好方法。test_my_fn 运行后,working_code.simplejson 恢复到函数调用前的状态。如果这令人困惑,您可以将测试示例视为:
import working_code
import mock
def test_my_fn():
mock_simplejson = mock.Mock()
working_code.simplejson = mock_simplejson
working_code.my_fn('test-args')
mock_simplejson.dumps.assert_called_with({'args': 'test-args'})