1

カスタム templatetag をテストするには、レンダリングされたテンプレートを返す関数をテストする必要があります。ユーザー生成のプロダクション テンプレート (時々変更される) を知らなくても出力を比較できるようにするために、TEMPLATE_DIRS 設定をオーバーライドしようとしています。Django 1.4 の新しい override_settings デコレーターの完璧な使用シナリオのように見えます。

@override_settings(TEMPLATE_DIRS='%s/templates' % os.path.abspath(os.path.dirname(__file__)) )
    def test_render_as_list(self):
        self.node.type = 'list'
        self.node.listtemplate = 'testtemplate.html'
        self.node.items = ['a', 'b', 'c']

        # these lines print the correct path to the template
        from django.conf import settings
        print(settings.TEMPLATE_DIRS)

        # inserted debug trace here
        import ipdb;ipdb.set_trace()            

        response = render_as_list(self.node, self.context)
        self.assertEqual(response,'item a, item b, item c')

これは私のディレクトリ構造がどのように見えるかです:

- project
    - app_to_test
        - fixtures
        - templatetags
        - tests
            __init__.py
            test_templatetags.py (containing the test shown above)
            templates
                testtemplate.html

私のコードを理解する限り、settings.TEMPLATE_DIRS は次を指す必要があります。

/some/path/project/app_to_test/tests/templates

新しい settings.TEMPLATE_DIRS 値を出力する行は、デコレータが機能したことを示していますが、それでも render_as_list 関数は戻ります

TemplateDoesNotExist: testtemplate.html

私は今何時間もそれで立ち往生しており、他に何を試すべきかを見つけることができません.

編集: パスの作成は機能しており、ファイルは存在しますが、Django はまだテンプレートをロードしません:

ipdb> from django.conf import settings
ipdb> path = settings.TEMPLATE_DIRS
ipdb> templatename = path+'testtemplate.html'
ipdb> templatename
'/Volumes/Data/project/my_app/tests/templates/testtemplate.html'
ipdb> template.loader.get_template(templatename)
*** TemplateDoesNotExist: /Volumes/Data/project/my_app/tests/templates/testtemplate.html
ipdb> f = file(templatename)
ipdb> f
<open file '/Volumes/Data/project/my_app/tests/templates/testtemplate.html', mode 'r' at 0x102e95d78>
ipdb> f.read()
'testtemplate content'
4

1 に答える 1

1

TEMPLATE_DIRS単一の文字列ではなく、1 つ以上の文字列のシーケンスである必要があります。文字列の各文字を独自のディレクトリとして使用しようとしています。

試す:

@override_settings(TEMPLATE_DIRS=['%s/templates' % os.path.abspath(os.path.dirname(__file__))] )

空白をエスケープする必要がある場合は、次を使用できます。

os.path.abspath(os.path.dirname(__file__)).replace(' ', r'\ ')

というファイルを表示します。

            testtemplate.py

そしてあなたのエラーは言う

 TemplateDoesNotExist: testtemplate.html

そしてあなたのコードは言う

    self.node.listtemplate = 'testtemplate.html'

あなたの.htmlファイルが.py.

于 2012-04-11T17:20:47.387 に答える