用于测试的临时TEMPLATE_DIRS覆盖不起作用

时间:2012-04-11 17:13:07

标签: django django-testing

为了测试自定义模板标签,我需要测试一个返回渲染模板的函数。为了能够比较输出而不必知道用户生成的生产模板(它将不时改变),我尝试覆盖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

要打印新设置的行.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'

1 个答案:

答案 0 :(得分:1)

TEMPLATE_DIRS需要是一个或多个字符串的序列,而不是单个字符串。它试图将字符串的每个字符用作自己的目录。

尝试:

@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