在 Python TestCase 中无法使用 self.client.get() 找到媒体文件
Media file cannot be found with self.client.get() in Python TestCase
我在项目根目录的 media
文件夹中有一张图片。我可以 ./manage.py runserver
并通过 127.0.0.1:8000/media/img.jpg
url 在浏览器中成功访问我的文件。但是下面的测试失败了 404!=200
。为什么?
class MyTestCase(TestCase):
def test_image_shows(self):
response = self.client.get('/media/img.jpg')
self.assertEquals(response.status_code, 200)
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
这既不直接也不优雅,但这是我为自己找到的最简单的方法:
1) urls.py 中的 Add a static rule(在生产环境中未启用):
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
2) 为您的测试用例启用 DEBUG
(以便启用静态规则):
from django.test import TestCase
from django.test.utils import override_settings
@override_settings(DEBUG=True)
class SomeTestCase(TestCase):
def test_something(self):
assert self.client.get('/medias/something.jpg').status_code == 200
如果您在测试期间写入媒体,您可能还想为测试指定一个不同的 MEDIA_ROOT
以免污染您的开发 MEDIA_ROOT
。可以找到一个示例 on caktus blog.
我在项目根目录的 media
文件夹中有一张图片。我可以 ./manage.py runserver
并通过 127.0.0.1:8000/media/img.jpg
url 在浏览器中成功访问我的文件。但是下面的测试失败了 404!=200
。为什么?
class MyTestCase(TestCase):
def test_image_shows(self):
response = self.client.get('/media/img.jpg')
self.assertEquals(response.status_code, 200)
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
这既不直接也不优雅,但这是我为自己找到的最简单的方法:
1) urls.py 中的 Add a static rule(在生产环境中未启用):
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
2) 为您的测试用例启用 DEBUG
(以便启用静态规则):
from django.test import TestCase
from django.test.utils import override_settings
@override_settings(DEBUG=True)
class SomeTestCase(TestCase):
def test_something(self):
assert self.client.get('/medias/something.jpg').status_code == 200
如果您在测试期间写入媒体,您可能还想为测试指定一个不同的 MEDIA_ROOT
以免污染您的开发 MEDIA_ROOT
。可以找到一个示例 on caktus blog.