Domanda

Vorrei scrivere un doctest come questo:

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

C'è un modo per farlo? Penso che avrebbe più senso passare a unittest, ma sono curioso di sapere se è possibile specificare un intervallo di output che non dovrebbe essere abbinato per il test in doctest.

Grazie!

È stato utile?

Soluzione

Con doctest.ELLIPSIS , puoi usare ... per indicare " abbinare qualsiasi stringa qui " ;. Puoi impostare le opzioni doctest con una direttiva doctest, per renderlo attivo per un solo caso di test: un esempio in documenti online è:

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

Se vuoi che un'opzione doctest sia attiva in tutto, puoi passarla come argomento optionflags = a qualunque funzione doctest tu usi, ad es. doctest.testfile . (Puoi passare più flag di opzione lì usando l'operatore | per bit-o loro).

Altri suggerimenti

Rispondere a domande su "come possiamo ignorare l'intera riga": sì, il fatto che " ... " sembra anche una continuazione come rende difficile ignorare l'intero output. Puoi utilizzare " #doctest: + SKIP " se vuoi semplicemente saltare completamente l'esempio, ma non funzionerà se ti affidi ai suoi effetti collaterali. Se davvero hai bisogno di fare questo, suppongo che potresti scimmiottare il modulo doctest stesso, anche se non lo consiglierei particolarmente:

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

(questo test ha superato.)

Oppure potresti sopprimere temporaneamente stdout e / o 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__

(passa anche questo test.)

Tuttavia, ignorare l'intera riga è un po 'complicato. Qui:

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

Il punto triplo verrà interpretato come continuazione della riga e causerà un errore di sintassi.

Se vuoi ignorare l'intera riga, avrai bisogno di qualcosa come:

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

Ho trovato più semplice assegnare semplicemente i valori di ritorno non necessari a una variabile:

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

Puoi scrivere tuple prima e dopo la tua funzione (hack ispirato alla risposta di Mark Horvath):

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

Posso avere dei puntini di sospensione all'inizio della riga in un doctest Python? spiega come creare un controllo di output personalizzato che utilizza una stringa aggiuntiva come puntini di sospensione. Ciò ti consentirebbe di scrivere quanto segue, pur continuando a usare '...' altrove.

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top