Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:更改测试的媒体根目录_Django_Unit Testing_Django Testing - Fatal编程技术网

Django:更改测试的媒体根目录

Django:更改测试的媒体根目录,django,unit-testing,django-testing,Django,Unit Testing,Django Testing,我正在尝试为Django应用程序编写一些测试,包括文件上传。为此,我想将MEDIA\u ROOT临时更改为“myproject/fixtures/test\u MEDIA/”。出于某种原因,这似乎阻止了Django找到固定装置 我的测试用例看起来像 from django.conf import settings class TestMedia(TestCase): fixtures = ['fixtures/test_data.json'] def setUp(self):

我正在尝试为Django应用程序编写一些测试,包括文件上传。为此,我想将
MEDIA\u ROOT
临时更改为“myproject/fixtures/test\u 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无法加载夹具,因此所有测试都会失败

安装fixture“fixtures/test_data.json”时出现问题:回溯(上次调用)


我做错了什么?

您是否尝试删除设置并查看是否可以加载夹具

此外,我不认为你真的需要改变媒体根来测试上传。您只需在拆卸中删除这些上载的文件即可恢复所有内容

编辑:

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

但是如果你必须这样做,那么使用另一个设置文件怎么样?像这样:

from mysite.settings import *

MEDIA_ROOT = '/what_ever_you_like'
并使用附加参数运行测试:

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

在设置中不重写,它只在运行TestCase子类的每个测试方法之前执行,在所有测试之前在模块中重写它

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

您可以覆盖测试的所有设置。这是一种更“Django”的方式——文档不鼓励直接更改
设置。这本书里有一节是关于它的

导入操作系统
从django.conf导入设置
从django.test导入TestCase,覆盖\u设置
@覆盖_设置(MEDIA_ROOT=os.path.join(settings.PROJECT_path,'fixtures/test_MEDIA/'))
类TestMedia(TestCase):
fixtures=['fixtures/test_data.json']
def设置(自):
#你还需要其他的安装工具吗
关于覆盖设置的更多信息。您可以在整个测试中使用装饰器:

从django.test导入TestCase,覆盖\u设置
@覆盖设置(登录URL='/other/LOGIN/')
类LoginTestCase(测试用例):
def测试_登录(自我):
response=self.client.get('/sekrit/'))
self.assertRedirects(响应,'/other/login/?next=/sekrit/')
或者,您可以只覆盖部分代码的设置:

来自django.test的
导入测试用例
类LoginTestCase(测试用例):
def测试_登录(自我):
#首先检查默认行为
response=self.client.get('/sekrit/'))
self.assertRedirects(响应,“/accounts/login/?next=/sekrit/”)
#然后覆盖登录URL设置
使用self.settings(LOGIN_URL='/other/LOGIN/'):
response=self.client.get('/sekrit/'))
self.assertRedirects(响应,'/other/login/?next=/sekrit/')

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

是的,没有设置,夹具工作正常。问题发生在我更改媒体根目录时。不过,我不知道MEDIA_ROOT应该如何影响fixture。至于使用原始MEDIA_ROOT的可能性,我不能这样做。我需要已经有一些媒体文件用于测试,但我无法将它们保存在实际的媒体目录中。使用附加参数运行测试的可能性很有趣。我仍然不知道为什么在测试中更改媒体根会破坏固定装置。Django对这种情况和其他情况有一个设置覆盖,非常有用。你可能想看看《难以置信9年过去了》和一个好问题到目前为止只投了一票