0

単体テストとして、一連の 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

もちろん、スタブアウトされたメソッド/クラスを my_fake_module に追加しない限り、ImportError が発生しますが、これを実用的にするには多すぎます。

my_fake_module からのインポートをフックして、常に成功するようにする方法はありますか? 繰り返しますが、何もする必要はありません。簡単な方法があると思いますが、今のところ私を逃れています...

4

1 に答える 1

1

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'

実際のコードは、おそらくラムダを返す、上記の概念の簡単な証明よりももう少し考える必要があるため、少なくともインポートされた値を実行できます。

次のようなことをしたいかもしれません:

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
于 2013-05-20T13:48:56.097 に答える