2009-06-21 9 views
22

私はこのようなdoctestのを書きたいのですが:python doctestはいくつかの出力行を無視できますか?

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

はこれを行う方法はありますか?私はunittestに切り替える方が理にかなっていると思いますが、doctestのテストでは一致してはならない出力の範囲を指定できるかどうか不思議です。

ありがとうございます!

答えて

31

doctest.ELLIPSISの場合、...は「ここに一致する文字列」を意味します。あなただけの1のテストケースのためにそれをアクティブにし、doctestのディレクティブでdoctestのオプションを設定できます。online docs内の1つの例です:あなたはdoctestのオプションは全体で有効にしたい場合は

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

は、あなたのようにそれを渡すことができますどのようなdoctest関数を使っても、例えばoptionflags=という引数を使用します。 doctest.testfile。 (複数のオプションフラグを渡すには、|演算子を使用してbit-or-bitを渡すことができます)。

+1

しかし、どのように行全体を無視できますか? –

+1

@ t0ster、 ''期待された出力 "(' doctest.ELLIPSIS'が設定されている)の全体として '...'を置くだけです。doctestはその出力行の内容を受け入れます。出力の "全体の行を無視する"。 –

+5

doctestは省略記号を前の行の(Python)継続と混同しているため、上記のように「行全体を無視する」は機能しません。私は全体の行を無視する方法を見つけることができませんでした。実際には、私は "全体の出力を無視する"を探していた。 –

4

しかし、行全体を無視するのはやや難解です。ここでは:

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

トリプルドットは行継続として解釈され、構文エラーが発生します。 「どのように我々は全体のラインを無視することができます」に関する質問への対応

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

ありがとう、これは便利なハックです! –

8

:あなたが行全体を無視する場合

、あなたのような何かをする必要がありますはい、という事実」...また、出力全体を無視するような継続性のように見えます。例を完全にスキップするだけの場合は "#doctest:+ SKIP"を使用できますが、その副作用に頼っている場合は機能しません。あなた本当には、これを行う必要がある場合は、私は特にそれをお勧めしませんが、私は、あなたがdoctestのモジュール自体を猿パッチができたとします

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

(。このテストは合格)

それとも、一時stdoutおよび/または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__ 

(この試験も通過する。)

0

Can I have an ellipsis at the beginning of the line in a Python doctest? EXPを追加の文字列を省略記号として使用するカスタム出力チェッカーを作成する方法があります。これにより、次のように書くことができますが、 '...'は他の場所で使用されます。

def foo(): 
    """ 
    >>> foo() # doctest: +ELLIPSIS 
    [...] world 
    """ 
    print "hello world" 
5

私はそれが簡単に、単純に変数に不要な戻り値を代入することが分かっ:

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

シンプル、ブラボー – michaelsnowden

1

あなたは、あなたの関数の前と後のタプルを書くことができます(ハックがマークHorvathのの答えに触発さ):

def foo(): 
    """ 
    >>>();foo();() # doctest: +ELLIPSIS 
    (...) 
    """ 
    print "Hello world" 
    return "Hello world" 
関連する問題