Nitenのバージョンはinside_doctest
広すぎるようです。sys.stdout
ロギングまたはdoctest以外のフレームワークでテストする場合に、再定義することはそれほど珍しいことではないため、誤検知が発生します。
より狭いテストは次のようになります。
import sys
def in_doctest():
"""
Determined by observation
"""
if '_pytest.doctest' in sys.modules:
return True
##
if hasattr(sys.modules['__main__'], '_SpoofOut'):
return True
##
if sys.modules['__main__'].__dict__.get('__file__', '').endswith('/pytest'):
return True
##
return False
def test():
"""
>>> print 'inside comments, running in doctest?', in_doctest()
inside comments, running in doctest? True
"""
print 'outside comments, running in doctest?', in_doctest()
if __name__ == '__main__':
test()
in_doctest
_SpoofOut
doctestがを置き換えるために使用するクラスのテストsys.stdout
。同じ方法で検証できるdoctestモジュールの他の属性があります。別のモジュールが名前を再利用するのを防ぐことができるわけではありませんが、この名前は一般的ではないので、おそらくまともなテストです。
上記をtest.pyに入れてください。非doctestモードで実行すると、次のようになりますpython test.py
。
outside comments, running in doctest? False
doctest冗長モードで実行すると、次のようになりpython -m doctest test.py -v
ます。
Trying:
print 'inside comments, running in doctest?', in_doctest()
Expecting:
inside comments, running in doctest? True
ok
コードにdoctestを認識させることは一般的に悪い考えであるという、他の人のコメントに同意します。私はややエキゾチックな状況でのみそれを行いました-手動で効率的に作成するには多すぎるため、コードジェネレーターを介してテストケースを作成する必要がありました。しかし、あなたがそれをする必要があるならば、上記はそれのためのまともなテストです。