在Python中模拟导入的模块

时间:2010-02-27 19:49:25

标签: python unit-testing mocking

我正在尝试为使用导入的外部对象的函数实现单元测试。

例如 helpers.py 是:

import os
import pylons

def some_func(arg):
   ...
   var1 = os.path.exist(...)
   var2 = os.path.getmtime(...)
   var3 = pylons.request.environ['HTTP_HOST']
   ...

所以,当我为它创建单元测试时,我会做一些嘲弄(在我的情况下是最小的) 并替换对pylons.request和os.path的引用:

import helpers
def test_some_func():
    helpers.pylons.request = minimock.Mock("pylons.request")
    helpers.pylons.request.environ = { 'HTTP_HOST': "localhost" }
    helpers.os.path = minimock.Mock(....)
    ...
    some_func(...)
    # assert
    ...

这对我来说不太好。

在Python中替换导入的函数/对象还有其他更好的方法或策略吗?

2 个答案:

答案 0 :(得分:2)

使用voidspace的模拟库以及它的修补/包装功能。

http://www.voidspace.org.uk/python/mock/patch.html

答案 1 :(得分:1)

嗯,在最小化方面,有一个比你上面使用的更简单的范例:

>>> from minimock import mock
>>> import os.path
>>> mock('os.path.isfile', returns=True)

请参阅http://pypi.python.org/pypi/MiniMock#creating-mocks

执行此操作后,执行os.path.isfile("blah")的任何模块都将返回True。您无需明确重新分配测试模块的命名空间。