2016-06-21 4 views
1

Ich habe ein Modul mit zwei Modulvariablen. Ich möchte sie für alle Tests in meiner Datei veröffentlichen. Anfangs habe ich Affen gepatcht, aber das stellte sich als Problem für Tests in anderen Dateien heraus, die diese Variablen benötigen, um intakt zu sein. Das ist etwas, was ich gerade herausgefunden habe. Es ist schrecklich, aber es funktioniert. Ich möchte etwas tun, die mehr „durch das Buch“, obwohl (dh etwas, das einen einzigen Gedankenstrich für alle Variablen halten werde ich Patch) ist:patchen mehrere Modulvariablen in allen Tests

@pytest.yield_fixture(autouse=True) 
def stub_module_variables(): 
    with patch.object(my_module, 'old_first_variable', new=new_first_variable): 
     with patch.object(my_module, 'old_second_variable', new=new_second_variable): 
      yield 
+0

Warum machst du das schrecklich? – sobolevn

+0

Ich nehme an, Sie wollen eine pytest spezifische Antwort? (z.B. _nicht_ eine "Unittest" -Antwort?) Wenn das der Fall ist, sollten wir wahrscheinlich das 'pytest'-Tag hinzufügen, wenn es eines gibt ...) – mgilson

+0

Es wird bei jeder Variablen, die ich patche, eingezeichnet. "Schrecklich" ist vielleicht ein falsches Wort hier, aber ich fühle mich wie der richtige Weg, dies zu tun, wäre etwas, das einen einzigen Gedankenstrich behält. – iknownothing

Antwort

0

but I feel like the proper way to do that would be something that keeps a single indent.

Mit Aussage mit mehreren Kontexten

können Sie mehrere Anweisungen in einem einzigen with

with patch.object(my_module, 'old_first_variable', new=new_first_variable), patch.object(my_module, 'old_second_variable', new=new_second_variable): 
    # your code here, single indent 

mit Erklärungen herhalten, mit mehrere Kontext, über mehrere Zeilen

Offensichtlich Ihre Linien sehr lang werden, hier einen Weg, um sie zu brechen, dass entspricht nach wie vor mit PEP8

with patch.object(my_module, 'old_first_variable', new=new_first_variable), \ 
    patch.object(my_module, 'old_second_variable', new=new_second_variable), \ 
    patch.object(my_module, 'old_third_variable', new=new_third_variable): 
    # Your code here, single indent 
    pass 

Ich lief pep8 auf eine Datei mit über Schnipsel, es geht .

+0

Ich habe das versucht, aber ich bekomme 'AttributeError: __exit__' in der Zeile mit dem zweiten Patch – iknownothing

+0

Hmm das funktioniert, aber ich bin mir nicht sicher warum. Kannst du etwas erklären? Auch die Syntax macht die Einrückung etwas komisch, aber ich muss damit leben. – iknownothing

+0

Es wird in der PEP8-Verknüpfung erklärt, PEP8 definiert Stilrichtlinien, und ein Teil davon ist, einen zusätzlichen Einzug zu haben, um ihn vom Körper des Blocks zu unterscheiden. – bakkal

Verwandte Themen