【问题标题】:Posting data using Django unit testing not saving to backend使用 Django 单元测试发布数据不保存到后端
【发布时间】:2018-07-27 08:20:24
【问题描述】:

我正在创建一个 django 应用程序,它在应用程序的设计方面之前实现了我的大部分逻辑。 我为用户注册创建了一个测试用例,但每当我发布到注册网址时,它都会收到我发布的数据,但从未将其填充到数据库中。

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)

【问题讨论】:

    标签: django django-testing


    【解决方案1】:

    TestCase 类将每个测试包装在一个事务中,该事务在事务之后回滚(参见相关的documentation)。

    即使test_registration成功注册了用户,在test_login中也不会出现。

    我建议创建一个用户以在 setUpClass 方法中进行测试。

    【讨论】:

      【解决方案2】:

      大约两天后,我找到了 Qts 的解决方案。 为了在单元测试成功后保留您的数据,您必须从 unittest 子类化一个 TestCase 否则执行自动回滚然后从 django.test 导入 TestCase。

      【讨论】:

        【解决方案3】:

        为此,您需要使用 import unittest 而不是 from django.test import TestCase

        并且在您的单元测试类中扩展 TestCaseunittest.TestCase

        请看下面的例子

        import unittest 
        class MyTest(unittest.TestCase):
            .......
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-11
          • 2018-08-05
          • 2013-06-30
          • 2019-10-16
          • 1970-01-01
          相关资源
          最近更新 更多