2012-08-09 5 views
10

Ich versuche, ein Mock von Matplotlib zu erzeugen, so dass ich meine Dokumente mit ReadTheDocs kompilieren kann, aber ein Problem haben.Wie zu mokieren, so dass `von x-Import *` funktioniert

In meinem Code importiere ich Matplotlib mit from matplotlib.pyplot import *.

Ich verwende den folgenden Code für meine Mocks (wie vom ReadTheDocs FAQ vorgeschlagen):

class Mock(object): 
    def __init__(self, *args, **kwargs): 
     pass 

    def __call__(self, *args, **kwargs): 
     return Mock() 

    @classmethod 
    def __getattr__(cls, name): 
     if name in ('__file__', '__path__'): 
      return '/dev/null' 
     elif name[0] == name[0].upper(): 
      return type(name,(), {}) 
     else: 
      return Mock() 

MOCK_MODULES = ['numpy', 'scipy', 'matplotlib', 'matplotlib.pyplot'] 
for mod_name in MOCK_MODULES: 
    sys.modules[mod_name] = Mock() 

Wenn jedoch from matplotlib.pyplot import * läuft ich einen Fehler sagen, dass TypeError: 'type' object does not support indexing.

Gibt es eine Möglichkeit, dass ich meine Mock ändern kann, damit ich Matplotlib mit der from x import * Art importieren kann? Ich brauche keine bestimmten Funktionen, die verfügbar gemacht werden müssen, ich brauche sie nur, damit sie importiert werden können, damit ReadTheDocs den Code richtig importieren kann.

+3

Randbemerkung: Sie nicht Ihre eigene Allzweck Mock rollen. Verwenden Sie die ausgezeichnete "Mock" -Bibliothek, in 3.3. Es ist sogar in der Standardbibliothek. – delnan

+0

Danke für den Kommentar - Ich fand, dass das Importieren der "Mock" -Bibliothek und dann die Verwendung der "Mock.Mock" -Klasse statt der von ReadTheDocs vorgeschlagenen Klasse alles gut funktioniert. – robintw

Antwort

7

Beim Import über * müssen Sie die __all__ Liste im Modul definieren. Das gleiche gilt mit Ihrer Klasse: fügen Sie einfach das __all__ Attribut auf die Klasse und es sollte funktionieren:

class Mock(object): 
    __all__ = [] 
+0

ReadTheDocs FAQ schlägt MagicMock: von unittest.mock Import MagicMock Klasse Mock (MagicMock): __all__ = [] @classmethod def __getattr __ (cls, Name): Mock zurückkehren() MOCK_MODULES = [ 'tkinter', 'tkinter.ttk'] sys.modules.update ((mod_name, Mock()) für mod_name in MOCK_MODULES) Aber es funktioniert nicht für tkinter.ttk ... – LRMAAX

Verwandte Themen