In pytest (3.04; Python 3.4) Ich versuche unter bestimmten Umständen die Ausgabe zu deaktivieren. Ich versuche dem Beispiel this doc page zu folgen. Allerdings kann ich Capsys nicht als Funcarg angeben. Als Follow-up möchte ich sowohl die Argumente funcarg als auch on-funcarg akzeptieren, so dass ich eine Klassenmethode verwenden kann, die ein oder mehrere normale Argumente annimmt. Wie kann ich das machen?In Pytest Wie deaktiviere ich Capture vorübergehend in einer Klassenmethode?
Idealerweise würde diese Klasse Methode funktioniert:
def always_print(self, message, capsys):
with capsys.disabled():
print(message)
Aber ich kann nicht einmal dies funktioniert:
def always_print(capsys):
with capsys.disabled():
print('FIXME')
Erhalten Sie den Fehler:
...
> always_print()
E TypeError: always_print() missing 1 required positional argument: 'capsys'
Edit 1: Piotrs Antwort löste meine Spezifikation c Problem. Allerdings habe ich auch entdeckt, zwei wichtige Vorbehalte, die ich hatte in der Dokumentation oder anderen Beiträgen nicht abgeholt, so dass für andere Nutzen hier teilen
- es scheint, dass capsys.disabled() gilt nur für stdout und nicht stderr, wo ich ursprünglich meine Debug-Nachrichten per * nix Best Practice gesendet habe.
- Wenn Sie ein Datei-Handle auf sys.stdout vor aufrufen capsys.disabled(), dann wird dies aufgrund der magischen Datei-Deskriptor Mangling, die Pytest tut, nicht funktionieren.
So zum Beispiel, müssen Sie es auf diese Weise (zum Beispiel tun, wenn Ihr kwargs eine optionale „Datei“ Schlüsselwort enthalten, wie die integrierte Druck() gibt:
fhandle = kwargs.get('file', sys.stdout) #will not work!
with capsys.disabled():
fhandle = kwargs.get('file', sys.stdout) #must be in context
print(message, file=fhandle)
ich sehe. Vielen Dank. Aber das bedeutet, dass ich die capsys funcarg zu jedem meiner Tests hinzufügen muss, um sie an die print_always-Methode zu übergeben. Ich würde das lieber nicht machen müssen, da es viel mehr Ausführlichkeit ist. Irgendwelche Vorschläge? – JJC
@JJC Hallo Kumpel, ich habe die Antwort bearbeitet und die Lösung hinzugefügt, um zusätzliche Ausführlichkeit zu vermeiden. –
Danke! Die Verwendung eines globalen Moduls ist vielleicht ein bisschen wie ein Klotz, aber es macht den Job fertig und vermeidet, dass viel Rauschen zu meinen Testfunktionen hinzugefügt wird. Ich habe zwei wichtige Vorbehalte entdeckt, als ich versuchte, dies zum Laufen zu bringen, was ich zuvor in der Dokumentation nicht erfahren hatte. Ich habe sie hinzugefügt. [Dzięki Piotrze! :)] – JJC