Как написать тест для 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}"

Вернуться на верх