Django:改变测试的媒体根

时间:2011-05-08 19:54:17

标签: django unit-testing django-testing

我正在尝试为Django应用程序编写一些测试,涉及文件上传。为此,我想暂时将MEDIA_ROOT更改为'myproject / fixtures / test_media /'。由于某种原因,似乎这会阻止Django找到灯具。

我的测试用例看起来像

from django.conf import settings

class TestMedia(TestCase):
    fixtures = ['fixtures/test_data.json']

    def setUp(self):
        settings.MEDIA_ROOT = ''.join(
            [settings.PROJECT_PATH, '/fixtures/test_media/'])

    def test_photo_size(self):
        pass # Actually do something with the media files

出于某种原因,Django无法加载灯具,因此所有测试都失败了

  

安装夹具'fixtures / test_data.json'时出现问题:Traceback(最近一次调用最后一次)   ...

我做错了什么?

3 个答案:

答案 0 :(得分:2)

您是否尝试删除setUp并查看是否可以加载灯具?

此外,我认为你真的不需要改变MEDIA_ROOT来测试上传。你可以在tearDown中删除那些上传的文件以恢复所有内容。

编辑:

您似乎正在生产环境中运行单元测试。老实说,这不是一个好主意。

但如果您必须这样做,那么使用其他设置文件怎么样?像这样:

from mysite.settings import *

MEDIA_ROOT = '/what_ever_you_like'

使用其他参数运行测试:

./manage.py test --settings=mysite.settings_for_test

答案 1 :(得分:2)

在setUp中没有覆盖,它只在运行TestCase子类的每个测试方法之前执行,在所有测试之前在模块中覆盖它。

from django.conf import settings
settings.MEDIA_ROOT += 'test'

答案 2 :(得分:0)

您可以覆盖测试的所有设置。它是一种更“Django”的方式 - 文档不鼓励直接更改 logs-2021.01.01 logs-2021.01.02 logs.2021.01.03 ...etc Django docs 中有一个部分是关于它的。

PUT _index_template/template_1
{
  "index_patterns": ["logs*"],
  "template": {
    "settings": {
      "number_of_shards": 6,
      "number_of_replicas": 1
    }

关于覆盖设置的更多信息。您可以在整个测试中使用装饰器:

settings

或者您可以只覆盖部分代码的设置:

import os
from django.conf import settings
from django.test import TestCase, override_settings

@override_settings(MEDIA_ROOT=os.path.join(settings.PROJECT_PATH, 'fixtures/test_media/'))
class TestMedia(TestCase):
    fixtures = ['fixtures/test_data.json']

    def setUp(self):
         # any other setup stuff you need

注意内联版本的不同语法。示例取自文档。