2013-05-20 4 views
0

Как единичный тест, я хотел бы иметь возможность проверить, что импорт, определенный в наборе графических интерфейсов, имеет смысл программно. Я не хочу ничего выполнять, толькоПоддельный модуль, включающий атрибуты

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, если я не добавить затушил method/class для my_fake_module, но есть слишком много, чтобы сделать это практичным.

Есть ли способ захватить импорт из my_fake_module, чтобы они всегда были успешными? Опять же, им ничего не нужно делать. Держу пари, что есть простой способ, но это спасаясь меня на данный момент ...

+1

я не уверен, что вы имеете в виду 'что-нибудь падает over', но делает' MyMod = __import __ ("module_name") 'помочь? вы можете вызвать 'reload (mymod)', и вы можете запускать тесты по переменной? Вы также можете изменить функцию/метод '__import__' со своим собственным и иметь резервные копии и обработку ошибок, даже создавать фиктивные функции/заглушки« на лету ». – Torxed

+0

«что-то падает» Я просто хочу увидеть, есть ли неработающие ссылки, опечатки и т. Д., Но я могу расширить его, чтобы найти сирот и другой анализ. Да, переопределение «__import__» звучит неплохо, но я пока не могу понять это или донести до него. Возможно, мне нужно сделать PEP302, создав нового импортера. – jambox

ответ

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 
+0

Да, своего рода. Я думаю, что ключом к моему пониманию было то, что мне нужно было понять, что мне пришлось обернуть модуль в классе, чтобы переопределить магические методы. Все, что мне нужно было сделать, - подорвать пару подмодулей в этом пакете по имени, поэтому они в конце концов работали в контексте единичного теста. См. Также: http://stackoverflow.com/a/2447383/455916 – jambox

Смежные вопросы