Question

J'aimerais écrire un doctest comme celui-ci:

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

Y a-t-il un moyen de faire cela? Je pense qu'il serait plus logique de passer au mode unittest, mais je suis curieux de savoir s'il est possible de spécifier une plage de résultats qui ne devrait pas être comparée pour le test de doctest.

Merci!

Était-ce utile?

La solution

Avec doctest.ELLIPSIS , vous pouvez utiliser ... pour signifier "faire correspondre n'importe quelle chaîne ici". Vous pouvez définir les options doctest avec une directive doctest, afin de l'activer pour un seul cas de test: un exemple dans documents en ligne est:

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

Si vous souhaitez qu'une option doctest soit toujours active, vous pouvez la transmettre en tant qu'argument optionflags = à toutes les fonctions doctest que vous utilisez, par exemple. doctest.testfile . (Vous pouvez y passer plusieurs drapeaux d’option en utilisant l’opérateur | pour les mettre à bit).

Autres conseils

Répondre aux questions sur "comment pouvons-nous ignorer toute la ligne": oui, le fait que " ... " ressemble également à une continuation, il est donc difficile d'ignorer la totalité de la sortie. Vous pouvez utiliser " #doctest: + SKIP " si vous voulez simplement ignorer entièrement l'exemple, mais cela ne fonctionnera pas si vous comptez sur ses effets secondaires. Si vous voulez vraiment faire cela, je suppose que vous pouvez corriger le module doctest lui-même, bien que je ne le recommande pas particulièrement:

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

(ce test réussit.)

Ou vous pouvez supprimer temporairement stdout et / ou 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__

(ce test réussit également.)

Ignorer toute la ligne est cependant un peu délicat. Ici:

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

Le point triple sera interprété comme une continuation de ligne et entraînera une erreur de syntaxe.

Si vous voulez ignorer toute la ligne, vous aurez besoin de quelque chose comme:

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

J'ai trouvé plus facile d'attribuer simplement les valeurs de retour inutiles à une variable:

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

Vous pouvez écrire des n-uplets avant et après votre fonction (inspiré par la réponse de Mark Horvath):

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

Puis-je avoir des points de suspension au début de la ligne dans un doctest Python? explique comment créer un vérificateur de sortie personnalisé utilisant une chaîne supplémentaire en tant que points de suspension. Cela vous permettrait d'écrire ce qui suit, alors que vous utilisiez toujours '...' ailleurs.

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top