Как я могу провести модульное тестирование сохранения пользовательского ввода в Django?

Я работаю над небольшим проектом и хочу иметь возможность протестировать методы post, сохранения в базе данных, если email не существует, и рендеринга в index.html для просмотра ниже. Я просмотрел видео на YouTube и учебники в блогах и не могу найти ответ, который я ищу. Я включил модель, представление и мои текущие тесты.

Модель:

class EmailList(models.Model):
    email = models.TextField(unique=True)

Вид:

def home(request):
    # Join Email List
    if request.method == 'POST':
        if request.POST.get('email'):
            email = request.POST.get('email')
            if not EmailList.objects.filter(email=email).exists():
                emailInput = EmailList()
                emailInput.email = email
                emailInput.save()
            return render(request, 'email/index.html', {})
    else:
        return render(request, 'email/index.html', {})

Тест, который у меня есть на данный момент:

from django.test import TestCase
from tasckq.models import EmailList   

class HomeViewTest(TestCase):
        @classmethod
        def setUpTestData(cls):
            # Create a new email to test
            EmailList.objects.create(email="test1@example.com")
    
        def test_home_view_url_exists_at_desired_location(self):
            response = self.client.get('')
            self.assertEqual(response.status_code, 200)
    
        def test_home_view_post_request_method(self):
            response = self.client.post('', {'email' : 'test1@example.com'})
            self.assertEqual(response.status_code, 200)
    
        def test_home_view_save_email(self):
            self.assertEqual(EmailList.objects.count(), 1)

Вы не должны создавать экземпляр EmailList в вашем методе setUpTestData, потому что вы хотите проверить, правильно ли ваше представление создает новый экземпляр, прямо сейчас вы вручную создаете новый экземпляр перед тестированием. Попробуйте следующее:

from django.test import TestCase
from tasckq.models import EmailList   

class HomeViewTest(TestCase):
   def test_home_view(self):
       # Tests the get method
       response = self.client.get('')
       self.assertEqual(response.status_code, 200)
       self.assertTemplateUsed(response, template_name='email/index.html')
       
       # Tests the post method
       
       email = 'test1@example.com'
       response = self.client.post('', {'email' : email})
       self.assertEqual(response.status_code, 200)
       self.assertTemplateUsed(response, template_name='email/index.html')
       # A new EmailList instance has been successfully created
       self.assertTrue(EmailList.objects.filter(email=email).exists())
       
       response = self.client.post('', {'email' : email})
       self.assertEqual(response.status_code, 200)
       self.assertTemplateUsed(response, template_name='email/index.html')
       # A new EmailList instance has not been created because the email was already in use
       self.assertEqual(EmailList.objects.count(), 1)
Вернуться на верх