2012-09-25 7 views
7

Nehmen wir an, wir haben ein System von Modulen, das nur in der Produktionsphase existiert. Zum Zeitpunkt der Prüfung existieren diese Module nicht. Trotzdem möchte ich Tests für den Code schreiben, der diese Module verwendet. Nehmen wir an, ich weiß, wie man alle notwendigen Objekte aus diesen Modulen herausspotten kann. Die Frage ist: Wie kann ich bequem Modul Stubs in die aktuelle Hierarchie hinzufügen?Wie spotte ich die Hierarchie von nicht vorhandenen Modulen?

Hier ist ein kleines Beispiel.

actual.py: 


def coolfunc(): 
    from level1.level2.level3_1 import thing1 
    from level1.level2.level3_2 import thing2 
    do_something(thing1) 
    do_something_else(thing2) 

ich schon alles, was ich brauche in meinem Test-Suite:: Ich habe thing1_mock und thing2_mock Die Funktionalität, die ich testen mag, wird in einer Datei namens actual.py platziert. Ich habe auch eine Testfunktion. Was ich brauche, ist level1.level2... in das aktuelle Modulsystem hinzuzufügen. Wie folgt aus:

tests.py 

import sys 
import actual 

class SomeTestCase(TestCase): 
    thing1_mock = mock1() 
    thing2_mock = mock2() 

    def setUp(self): 
    sys.modules['level1'] = what should I do here? 

    @patch('level1.level2.level3_1.thing1', thing1_mock) 
    @patch('level1.level2.level3_1.thing1', thing2_mock) 
    def test_some_case(self): 
    actual.coolfunc() 

weiß ich, dass ich sys.modules['level1'] mit einem Objekt ersetzen kann ein anderes Objekt enthält, und so weiter. Aber es scheint mir eine Menge Code zu sein. Ich gehe davon aus, dass es eine viel einfachere und schönere Lösung geben muss. Ich kann es einfach nicht finden.

Antwort

9

Also half mir niemand mit meinem Problem und ich beschloss, es selbst zu lösen. Here ist eine Mikro-Lib namens surrogate, die es ermöglicht, Stubs für nicht vorhandene Module zu erstellen.

kann Lib mit mock wie folgt verwendet werden:

from surrogate import surrogate 
from mock import patch 

@surrogate('this.module.doesnt.exist') 
@patch('this.module.doesnt.exist', whatever) 
def test_something(): 
    from this.module.doesnt import exist 
    do_something() 

Zum einen @surrogate Dekorateur schafft Stubs für nicht vorhandene Module, dann @patch Dekorateur kann sie ändern. Genau wie @patch, @surrogate können Dekoratoren "im Plural" verwendet werden, wodurch mehr als ein Modulweg gestoßen wird. Alle Stubs existieren nur während der Lebensdauer der dekorierten Funktion.

Wenn irgendjemand Gebrauch von dieser Bibliothek bekommt, wäre das großartig :)

Verwandte Themen