使用 Django 单元测试发布数据不保存到后端
Posting data using Django unit testing not saving to backend
我正在创建一个 Django 应用程序,它在应用程序的设计方面之前实现了我的大部分逻辑。
我为用户注册创建了一个测试用例,但每当我 post 注册 url 时,它都会收到我的 posted 数据,但从未将其填充到数据库中。
class AuthTest(TestCase):
def setUp(self):
self.client = Client()
def test_reg_index(self):
response = self.client.get(reverse_lazy('register'))
return self.assertEqual(response.status_code, 200)
def test_registration(self):
data = {
'last_name': 'test_user',
'first_name': 'test_user',
'email': 'fashtop3@gmail.com',
'phone': '08035112897',
}
response = self.client.post(reverse_lazy('register'), data)
self.assertEqual(response.status_code, 302)
def test_login(self):
# self.client.login(username='foo', password='bar') # request.user is now user foo
data = {
'email': 'test_user@example.com',
'password': 'pass123',
}
response = self.client.post(reverse_lazy('login'), data)
self.assertEqual(response.status_code, 200)
class RegisterView(FormView):
"""
this handles users registration
"""
form_class = RegForm
template_name = "club/register.html"
success_url = reverse_lazy("register")
# def get(self, request, *args, **kwargs):
# return super(RegisterView, self).get(request, *args, **kwargs)
def form_invalid(self, form):
print(form.errors.as_data)
return super().form_invalid(form)
def form_valid(self, form):
"""
Process valid registration form
:param form:
:return: redirects to success_url
"""
random_password = ''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(6))
try:
with transaction.atomic():
"""Allow database transactions"""
data = form.cleaned_data
user = User.objects.create_user(
email=data['email'],
password=random_password,
remember_token=hashlib.sha1(str(datetime.now()).encode('utf-8')).hexdigest()
)
user.profile.last_name = data['last_name']
user.profile.first_name = data['first_name']
user.profile.phone = data['phone']
user.save()
send_notification.delay(user.pk, random_password)
print('Reg success')
messages.success(self.request, "Regular successfully registered "
"please check your mail for verification",
extra_tags="alert-success")
except IntegrityError as e:
print(e)
messages.error(self.request, "Registration Failed: Email address already exist", extra_tags="alert-danger")
return super(RegisterView, self).form_invalid(form)
except Exception as e:
print(str(e))
messages.error(self.request, "Registration Error, contact site administrator: ", extra_tags="alert-danger")
return super(RegisterView, self).form_invalid(form)
return super(RegisterView, self).form_valid(form)
TestCase
class将每个测试都包装在一个事务中,事务后回滚(见相关documentation)。
即使 test_registration
成功注册用户,也不会在 test_login
中可用。
我建议在 setUpClass
方法中创建一个用户进行测试。
大约两天后,我得到了 Qts 的解决方案..
为了在单元测试成功后保留您的数据,您必须从 unittest 子类化 TestCase 否则执行自动回滚然后从 django.test.
导入 TestCase
为此,您需要使用 import unittest 而不是 from django.test import TestCase
并且在你的单元测试中 class 用 unittest.TestCase
扩展了 TestCase
看下面的例子
import unittest
class MyTest(unittest.TestCase):
.......
我正在创建一个 Django 应用程序,它在应用程序的设计方面之前实现了我的大部分逻辑。 我为用户注册创建了一个测试用例,但每当我 post 注册 url 时,它都会收到我的 posted 数据,但从未将其填充到数据库中。
class AuthTest(TestCase):
def setUp(self):
self.client = Client()
def test_reg_index(self):
response = self.client.get(reverse_lazy('register'))
return self.assertEqual(response.status_code, 200)
def test_registration(self):
data = {
'last_name': 'test_user',
'first_name': 'test_user',
'email': 'fashtop3@gmail.com',
'phone': '08035112897',
}
response = self.client.post(reverse_lazy('register'), data)
self.assertEqual(response.status_code, 302)
def test_login(self):
# self.client.login(username='foo', password='bar') # request.user is now user foo
data = {
'email': 'test_user@example.com',
'password': 'pass123',
}
response = self.client.post(reverse_lazy('login'), data)
self.assertEqual(response.status_code, 200)
class RegisterView(FormView):
"""
this handles users registration
"""
form_class = RegForm
template_name = "club/register.html"
success_url = reverse_lazy("register")
# def get(self, request, *args, **kwargs):
# return super(RegisterView, self).get(request, *args, **kwargs)
def form_invalid(self, form):
print(form.errors.as_data)
return super().form_invalid(form)
def form_valid(self, form):
"""
Process valid registration form
:param form:
:return: redirects to success_url
"""
random_password = ''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(6))
try:
with transaction.atomic():
"""Allow database transactions"""
data = form.cleaned_data
user = User.objects.create_user(
email=data['email'],
password=random_password,
remember_token=hashlib.sha1(str(datetime.now()).encode('utf-8')).hexdigest()
)
user.profile.last_name = data['last_name']
user.profile.first_name = data['first_name']
user.profile.phone = data['phone']
user.save()
send_notification.delay(user.pk, random_password)
print('Reg success')
messages.success(self.request, "Regular successfully registered "
"please check your mail for verification",
extra_tags="alert-success")
except IntegrityError as e:
print(e)
messages.error(self.request, "Registration Failed: Email address already exist", extra_tags="alert-danger")
return super(RegisterView, self).form_invalid(form)
except Exception as e:
print(str(e))
messages.error(self.request, "Registration Error, contact site administrator: ", extra_tags="alert-danger")
return super(RegisterView, self).form_invalid(form)
return super(RegisterView, self).form_valid(form)
TestCase
class将每个测试都包装在一个事务中,事务后回滚(见相关documentation)。
即使 test_registration
成功注册用户,也不会在 test_login
中可用。
我建议在 setUpClass
方法中创建一个用户进行测试。
大约两天后,我得到了 Qts 的解决方案.. 为了在单元测试成功后保留您的数据,您必须从 unittest 子类化 TestCase 否则执行自动回滚然后从 django.test.
导入 TestCase为此,您需要使用 import unittest 而不是 from django.test import TestCase
并且在你的单元测试中 class 用 unittest.TestCase
扩展了 TestCase看下面的例子
import unittest
class MyTest(unittest.TestCase):
.......