假包含属性的模块

时间:2013-05-20 12:39:15

标签: python unit-testing python-2.7

作为单元测试,我希望能够测试一组GUI屏幕中定义的导入是否以编程方式有意义。我不想执行任何操作,只需

import main_screen

并查看在进口链中是否有任何问题。我已经使用了sys.modules技巧:

import my_fake_module
sys.modules['module_i_want_to_fake'] = my_fake_module

哪种方法很有效,直到某些方法为止:

from module_i_want_to_fake import real_attribute

然后我当然得到一个ImportError,除非我向my_fake_module添加一个stubbed out方法/类,但是有太多的东西可以使它变得实用。

有没有办法从my_fake_module挂钩导入,以便它们始终成功?同样,他们不需要做任何事情。我打赌这有一个简单的方法,但它现在正在逃避我......

1 个答案:

答案 0 :(得分:1)

一个选项是创建一个自定义FakeModule类来处理__getattr__并分发适当的存根函数/值:

>>> class FakeModule:
...     def __getattr__(self, name):
...         print name
...         return name
...
>>> sys.modules['fakeModule'] = FakeModule()
>>> from fakeModule import something
__path__
something
something
>>> something
'something'

实际代码需要比上面的概念快速证明更多的思考,可能返回一个lambda,所以你至少可以执行导入的值。

您可能想要这样做:

from functools import wraps

class FakeModule(object):
    def __init__(self):
        self.module = __import__("module_to_fake")

    @staticmethod
    def __testWrapper(fn):
        @wraps(fn)
        def wrapped(*args):
            print "%s called with args %s" % (fn.__name__, args)
            result = fn(*args)
            print "    Result was %s" % (result,)
            return result
        return wrapped

    def __getattr__(self, name):
        try:
            result = getattr(module, name)
        except AttributeError:
            print "tried to get %s, which does not exist" % name
            result = None

        if hasattr(result, "__call__"):
            result = self.__testWrapper(result)

        return result