2017-02-26 6 views
1

だから私はいくつかのsphinxdoc拡張を書いた。(PyCharmの)カバレッジを持つsphinxdoc拡張機能をユニットテストする方法は?

from docutils import nodes 
from docutils.statemachine import StringList 
from sphinx.util.compat import Directive 

class SvnRevisionDirective(Directive): 
    """Directive to display subversion revision of the path. 
    """ 
    has_content = True 
    required_arguments = 1 
    optional_arguments = 1 
    final_argument_whitespace = False 
    option_spec = {} 

    def run(self): 
     path = self.arguments[0] 
     # rev = svntools.Revision(path) 
     rev = 42 
     paragraph = nodes.paragraph() 
     self.state.nested_parse(
      StringList([ 
       '**Revision:** r%d' % rev 
      ]), 0, paragraph) 
     return [paragraph] 

def setup(app): 
    """Directive framework code. 
    """ 
    app.add_directive('svnrevision', SvnRevisionDirective) 

拡張へのパスは、ドキュメントのconf.pyそれは次のように使用することができるでextensionsに追加された後に:(それは最も単純なものであるので、一例として用いた)これ

.. svnrevision:: mypackage/__init__.py 

と生成されます。

リビジョン: R42

はちょうどそれが動作していることをテストするには私はtests/testprojディレクトリを作成し、docsディレクトリ、conf.pyファイル、およびディレクティブを含むindex.rstファイル、および使用とそれを埋めることができます。

import os 
import pytest 
DIRNAME = os.path.dirname(__file__) 

@pytest.mark.django_db 
def test_svnrevision(monkeypatch): 
    testprojdir = os.path.join(DIRNAME, 'testproj') 
    monkeypatch.setenv('PYTHONPATH', testprojdir, os.pathsep) 
    monkeypatch.setenv('DJANGO_SETTINGS_MODULE', 'testingapp.settings') 
    monkeypatch.chdir(DIRNAME) 
    cmd = 'sphinx-build -bhtml -a -E testproj/docs testproj/build' 
    os.system(cmd) 

が、これはテストとコードの間の距離の多くを与え、 PyCharmの下で実行されたときには少なくともコードカバレッジを与えません。

私は可能これで例えばと類似の直接もっと何か、:

def test_svnrevision(): 
    rst = """ 
     .. svnrevision:: mypackage/__init__.py 
    """ 
    svndirective = SvnRevisionDirective(...., rst, ...) 
    result = svndirective.run() 
    assert result.___ == '**Revision:** 42' 

をご希望ですか?

+0

関連するスフィンクスの問題:https://github.com/sphinx-doc/sphinx/issues/3458 – marbu

答えて

0

unittestまたはnoseを使用している場合は、sphinx-testingモジュールを使用できます。これはPyPIで利用できます。

pytestベースのユニットテストでは、the approach differs based on Sphinx version you are usingです。

スフィンクス1.6.1以来、Sphinx Developer’s Guideに記載されているpytestプラグインsphinx.testing.fixturesを使用することができます。この機能はまだ実験中ですが、以下に説明する他の機能と比較してはるかに良い選択肢と思われます。

スフィンクスでのpytestテストでは、< = 1.6.0の場合、Sphinxテストフィクスチャを直接再利用する方法はありません。一つは、それがカスタムスフィンクスランナー(run.pyファイル)せずに作業を取得するビットを、独自のプロジェクトにsphinx/tests directoryからcontest.pypath.pyutil.pyファイルをコピーしてutil.pyファイルをハックしようとすることができます:

+# code from run.py 
+testroot = os.path.dirname(__file__) or '.' 
+# find a temp dir for testing and clean it up now 
+os.environ['SPHINX_TEST_TEMPDIR'] = \ 
+ os.path.abspath(os.path.join(testroot, 'build')) \ 
+ if 'SPHINX_TEST_TEMPDIR' not in os.environ \ 
+ else os.path.abspath(os.environ['SPHINX_TEST_TEMPDIR']) 
+ 
rootdir = path(os.path.dirname(__file__) or '.').abspath() 
tempdir = path(os.environ['SPHINX_TEST_TEMPDIR']).abspath() 

+# code from run.py 
+print('Temporary files will be placed in %s.' % tempdir) 
+if tempdir.exists(): 
+ tempdir.rmtree() 
+tempdir.makedirs() 
+ 

そして、あなたはユニットテストを書きますあなたがSphinx単体テストで見るのと同じ方法です。

+0

私は最初に 'sphinx/tests'を抽出して使用しようとしましたが、それほど協力的ではありませんでした(私は '利用可能な時間にそれを解くことはできません)。私は 'sphinx-testing'を見ていきます。 – thebjorn

関連する問題