Frage

Ich möchte eine doctest wie folgt schreiben:

"""
>>> print a.string()
          foo : a
          bar : b
         date : <I don't care about the date output>
          baz : c
"""

Gibt es eine Möglichkeit, dies zu tun? Ich denke, es würde mehr Sinn machen, Unittest zu wechseln, aber ich bin gespannt, ob es möglich ist, einen Bereich von Ausgang angeben, die nicht für den Test in doctest abgestimmt werden sollten.

Danke!

War es hilfreich?

Lösung

Mit doctest.ELLIPSIS Sie ... verwenden können, bedeuten „jeden String hier“. Sie können doctest Optionen mit einer doctest Richtlinie festgelegt, um es nur für einen Testfall aktiv zu machen: ein Beispiel in dem Online-docs ist:

>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]

Wenn Sie eine Option doctest wollen agierende sein, können Sie es als optionflags= Argument übergeben, was auch immer doctest Funktionen, die Sie verwenden, z.B. doctest.testfile. (Sie können mehrere Optionsflaggen vorbei die | Operator Bit-oder mit ihnen).

Andere Tipps

Beantwortung von Fragen zum Thema „Wie können wir die ganze Zeile ignorieren“: ja, die Tatsache, dass „...“ auch wie eine Fortsetzung sieht aus wie macht es schwer, die gesamte Ausgabe zu ignorieren. Sie können „#doctest: + SKIP“ verwenden, wenn Sie nur ganz das Beispiel überspringen wollen, aber das wird nicht funktionieren, wenn Sie auf ihre Nebenwirkungen setzen. Wenn Sie wirklich müssen dies tun, nehme ich Sie könnte den doctest Modul selbst Affe-Patch, obwohl ich würde vor allem nicht empfehlen:

>>> import doctest
>>> doctest.ELLIPSIS_MARKER = '-etc-'
>>> print 12 # doctest: +ELLIPSIS
-etc-

(dieser Test bestanden wird.)

Oder Sie könnten vorübergehend unterdrücken stdout und / oder stderr:

>>> # Suppress stdout
>>> import sys
>>> class DevNull:
...     def noop(*args, **kwargs): pass
...     close = write = flush = writelines = noop
>>> sys.stdout = DevNull()
>>> # Run a test and ignore output (but we need its side effects)
>>> print 12 # NOTE: stdout is suppressed!
>>> # Restore stdout
>>> sys.stdout = sys.__stdout__

(dieser Test auch passiert.)

die ganze Zeile zu ignorieren ist allerdings etwas schwierig. Hier:

"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""

Der dreifache Punkt wird als Zeilenfortsetzungs interpretiert werden, und einen Syntaxfehler verursachen.

Wenn Sie die ganze Zeile ignorieren wollen, werden Sie wie etwas brauchen:

"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""

Ich fand es einfacher, einfach die nicht benötigten Rückgabewerte einer Variablen zuweisen:

>>> _ = do_something()
>>> check_something()
True

Sie können Tupel vor und nach der Funktion (Hack inspiriert von Antwort von Mark Horvath) schreiben

def foo():
    """
    >>> ();foo();() # doctest: +ELLIPSIS
    (...)
    """
    print "Hello world"
    return "Hello world"

Kann ich ein Auslassungszeichen am Anfang der Zeile habe in einem Python doctest? erklärt, wie eine benutzerdefinierte Ausgabeprüfung erstellen, die eine zusätzliche Zeichenkette als Auslassungszeichen verwendet. Dies würden Sie die folgende schreiben, während sie noch verwendet ‚...‘ an anderer Stelle.

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top