如何在 Django 中对保存用户输入进行单元测试?
How can I unit test saving user input in Django?
我正在做一个小项目,我希望能够测试 post 方法,如果电子邮件不存在则保存到数据库,并呈现到 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 email.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)
你不应该在你的 setUpTestData
方法中创建一个 EmailList
的实例,因为你想检查你的视图是否正确创建了一个新实例,现在你在测试之前手动创建一个新实例.试试这个:
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)
我正在做一个小项目,我希望能够测试 post 方法,如果电子邮件不存在则保存到数据库,并呈现到 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 email.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)
你不应该在你的 setUpTestData
方法中创建一个 EmailList
的实例,因为你想检查你的视图是否正确创建了一个新实例,现在你在测试之前手动创建一个新实例.试试这个:
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)