У меня есть models.py досье. Как я могу написать для него тест? Что тестировать?

#python #django

#python #django

Вопрос:

Как писать тесты для models.py файл?

 from django.db import models
from django.conf import settings
from django.utils import timezone
from django.contrib.auth.models import User


class Profile(models.Model): #new
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    institute = models.CharField(max_length=200, null=True)
    department = models.CharField(max_length=200, null=True)

    def __str__(self):
        return 'Email:{} Department:{} Institute:{}'.format(self.user.email, self.institute, self.department)


class Access(models.Model):
    user = models.ManyToManyField(User)
    endpoint = models.CharField(
        max_length=20,
        choices=(
            ('pubmed', 'pubmed'),
            ('foster', 'foster'),
            ('med_apps', 'med_apps'),
            ('mayerson_transcripts', 'mayerson_transcripts'),
            ('all', 'all')
        ),
        unique=True
    )

    def __str__(self):
         return self.endpoint


class Request(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    created_time = models.DateTimeField(default=timezone.now)
    url = models.CharField(max_length=1000)
    def start(self):
        self.created_time = timezone.now()
        self.save()

    def __str__(self):
        return 'url:{} time:{}'.format(self.url, self.created_time)
 

Необходимо запустить тест в Visual Studio Code.
Кроме того, я видел много примеров написания тестов, но снова запутался. Похоже, мне нужно поработать над основами.

Ответ №1:

в зависимости от того, где находится ваша логика (в представлениях django или в моделях) и где происходили действия, вы пишете свои тесты, в примере выше я не вижу никакой логики или действия, я приведу простой пример, ниже приведен пример написания теста в представлении регистрации:

 from django.test import Client
from django.test import TestCase
from account.models import Account

class TestSequenceFunctions(TestCase):
        
    def test_signup_index_view(self):  #Test number 1

        response = self.client.post(reverse('acc:signup'), data=
         {'fname':'ftest',
         'lname':'ltest',
         'email':'foo2@bar.com', 
         'password':'1111',
         'pass2':'1111',
         'field':'something',
         'degree':'1',
         }, follow=True)

        self.assertEqual(response.status_code, 200)
 

Ответ №2:

Создайте test_models.py файл — обратите внимание, что рекомендуется иметь отдельный тестовый файл для представлений, моделей, API и т. Д:

 test_views.py
test_api.py
test_models.py
test_tasks.py
 

Ваши модели довольно просты, и вы не можете протестировать ничего особенного. Вы можете, например, протестировать свою модель запроса и проверить, изменяет ли функция start поле created_time. Например:

 def test_start(mocker):
    request_model =  RequestFactory.create()
    request_model.start()
    assert request_model.created_time == timezone.now()
 

Вы также можете издеваться над методом «сохранить» и утверждать, что он вызывается. Например:

 save_patch = mocker.patch('app_name.models.Request.save')
save_patch.assert_called_once()
save_patch.assert_called_once_with(params)
 

Я бы рекомендовал начать с более простого примера, а не с поля часового пояса, поскольку я не уверен, есть ли задержка, которую тест может не пройти.

Вы можете найти, как имитировать объекты и утверждать, что они называются, используя Factory Boy и DjangoModelFactory для создания поддельных объектов для тестирования (таких как RequestFactory в примере).