Как написать тест для url изображения в Django
Я пишу свой первый тест в качестве разработчика Django. Как мне написать тест для свойства image этой модели, показанной ниже
class Project(models.Model):
engineer = models.ForeignKey(Engineer, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
tech_used = models.CharField(max_length=200)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
image = models.ImageField(default="project.png")
description = models.TextField(null=True, blank=True)
repo_url = models.URLField(null=True, blank=True)
live_url = models.URLField(null=True, blank=True)
make_public = models.BooleanField(default=False)
def __str__(self):
return self.name
@property
def image_url(self):
try:
url = self.image.url
except:
url = ""
return url
class Meta:
ordering = ["-created"]
Я попытался собрать некоторые патчи отсюда и оттуда, хотя я не совсем понимаю, что означает код test.py, я просто решил включить его в свой вопрос, чтобы показать свои усилия
class TestModels(TestCase):
def setUp(self):
new_image = BytesIO()
self.image = Project.objects.create(
image=ImageFile(new_image)
)
def test_image_url(self):
self.assertEquals(self.image.image_url, '')
Пожалуйста, помощь по вышеуказанному вопросу и объяснение любого кода, приведенного в качестве помощи, будут высоко оценены.
Следуя этому ответу, один из возможных путей таков:
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase
from django.utils import timezone
from .models import Engineer, Project
class ProjectImageUploadTest(TestCase):
def setUp(self):
self.engineer = Engineer.objects.create(name='Engineer')
self.project = {
'engineer': self.engineer,
'name': 'Test project',
'tech_used': 'Test tech',
'updated': timezone.now(),
'created': timezone.now(),
'image': None,
'description': 'Test description',
'repo_url': 'https://www.repo.example.com',
'live_url': 'https://www.live.example.com',
'make_public': False
}
self.obj = Project.objects.create(**self.project)
def tearDown(self):
self.obj.image.delete()
def test_upload_image(self):
img_url = r'X:\Path\to\your\image.png'
self.obj.image= SimpleUploadedFile(
name='test_image.jpg',
content=open(img_url, 'rb').read(),
content_type='image/png')
self.obj.save()
self.obj.refresh_from_db()
self.assertNotEqual(self.obj.image, None)
Я хотел бы дополнить, что также возможно реализовать тест, используя Python tempfile.
Для проверки url-значения поля image в модели используйте приведенный ниже код. Код был написан на pytest, но идею можно рефакторить и реализовать в тестах unittest.
models.py
...
class Project(models.Model):
... # other fields ignore for brevity
image = models.ImageField(default="project.png")
tests.py
import pytest
from django.conf import settings
# ensure that you have set your MEDIA_URL variable in your project settings, example; MEDIA_URL = "/media/"
from myapp.models import Project
IMAGE_FILE = "test_file.png"
@pytest.fixture
def project_one():
return Project.objects.create(
# other attribute filled in
image = IMAGE_FILE,
)
@pytest.mark.django_db
def test_project_image_url(project_one):
assert project_one.image.url = f"{settings.MEDIA_URL}{IMAGE_FILE}"