2016-06-03 25 views
1

Ich möchte meine eigene Pytest-Vorrichtung erstellen, wo ich einfügen kann, was ich in der Setup- und Teardown-Phase tun soll.Wie erstelle ich meine eigene Pytest-Halterung?

Ich suche so etwas wie (in diesem Beispiel i erstelle eine Datei, die für den Test benötigt):

@pytest.fixture 
def file(path, content): 
    def setup(): 
     # check that file does NOT exist 
     if os.path.isfile(path): 
      raise Exception('file already exists') 

     # put contents in the file 
     with open(path, 'w') as file: 
      file.write(content) 
    def teardown(): 
     os.remove(path) 

und ich möchte in der Lage sein, es zu benutzen wie folgt aus:

def test_my_function(file): 
    file('/Users/Me/myapplication/info.txt', 'ham, eggs, orange juice') 
    assert my_function('info') == ['ham', 'eggs', 'orange juice'] 

Ich bin mir bewusst, es gibt bereits eine tempdir Leuchte in Pytest, die ähnliche Funktionalität hat. Leider erstellt dieses Gerät nur Dateien irgendwo innerhalb des Verzeichnisses /tmp, und ich brauche Dateien in meiner Anwendung.

Danke!

UPDATE: Ich bin ziemlich nah dran. Das Folgende funktioniert fast, aber es setzt die PATH-Variable global nicht auf das Fixture, wie ich es erwartet hatte. Ich frage mich, ob ich eine Klasse anstelle einer Funktion für mein Gerät erstellen kann.

@pytest.fixture 
def file(request): 
    PATH = None 
    def setup(path, content): 
     PATH = path 

     # check that file does NOT exist 
     if os.path.isfile(PATH): 
      raise Exception('file already exists') 

     # put contents in the file 
     with open(PATH, 'w+') as file: 
      file.write(content) 
    def teardown(): 
     os.remove(PATH) 
    request.addfinalizer(teardown) 
    return setup 

Antwort

1

Das ist ein bisschen verrückt, aber hier ist eine Lösung:

@pytest.fixture 
def file(request): 
    class File: 
     def __call__(self, path, content): 
      self.path = path 

      # check that file does NOT exist 
      if os.path.isfile(self.path): 
       raise Exception('file already exists') 

      # put contents in the file 
      with open(self.path, 'w+') as file: 
       file.write(content) 
     def teardown(self): 
      os.remove(self.path) 
    obj = File() 
    request.addfinalizer(obj.teardown) 
    return obj 
+0

ich nicht meine spezifische Lösung gemeinsam nutzen kann, aber es ist im Sinne dieser allgemeinen Idee, und es scheint gut zu funktionieren . Meine Version hat einen Stapel, der alle erstellten Dateien verfolgt und sie dann am Ende löscht. Ich entschied mich auch, das Send2Trash-Modul zu verwenden, so dass gelöschte Dateien in den Papierkorb meines Computers gelangen würden, anstatt sofort entfernt zu werden. Dies kann zur Fehlerbehebung hilfreich sein, wenn der Code fehlschlägt usw. – mareoraft