Django-单元测试中的代码重复方法

时间:2019-11-30 07:14:51

标签: django

简短介绍。
我只是在学习为应用程序编写测试。该应用程序是在线成绩簿。 以下是主页视图测试中的代码。只有登录表单。如果用户是首次登录,则将其重定向到强制更改默认密码的视图。如果是下一次登录,则根据用户权限将其重定向到正确的视图。

问题。
在此视图测试中,我必须创建6个用户和相关模型(学生,父母,教师),因此我编写了创建这些对象的方法( create_user / create_person >)。 在将来的许多视图测试中,我还必须登录用户并使用模型(学生,家长,教师)。
我应该如何重复这些步骤?我想到两种方式。
1.将方法转换为静态方法,并在下一个测试类中使用它们来创建对象。测试是否仍将是“统一的”?
2.将方法定义复制到将需要它们的每个下一个测试类。这不会违反DRY原则吗?

哪种方法好?

class HomepageViewTestCase(TestCase):
    password = 'testerspass'

    def create_user(self):
        username = 'tester'
        numbering = 0
        while True:
            try:
                User.objects.get(username=username)
                numbering += 1
                username += str(numbering)
            except User.DoesNotExist:
                return User.objects.create_user(
                    username=username, password=self.password,
                    first_name='Name', last_name='Surname')

    def create_person(self, kind):
        content_type = ContentType.objects.get_for_model(RightsSupport)
        permission = Permission.objects.get(content_type=content_type,
                                            codename=kind)
        if kind in {'student', 'parent'}:
            user = self.create_user()
            user.user_permissions.add(permission)
            try:
                school_class = SchoolClass.objects.get(unique_code='2a2020')
            except SchoolClass.DoesNotExist:
                school_class = SchoolClass.objects.create(unique_code='2a2020',
                                                          name='2a', year=2020)
            student = Student.objects.create(user=user,
                                             school_class=school_class,
                                             name=user.first_name,
                                             surname=user.last_name,
                                             birthday='2010-03-29')
            if kind == 'student':
                return student
            if kind == 'parent':
                user = self.create_user()
                user.user_permissions.add(permission)
                return Parent.objects.create(user=user, student=student,
                                             name=user.first_name,
                                             surname=user.last_name)
        if kind == 'teacher':
            user = self.create_user()
            user.user_permissions.add(permission)
            return Teacher.objects.create(user=user, name=user.first_name,
                                          surname=user.last_name)

    def setUp(self):
        # Create users and student/parent/teacher models objects to test login
        # by homepage
        self.student_1 = self.create_person('student')
        self.student_1_form_data = {'username': self.student_1.user.username,
                                    'password': self.password}
        self.student_2 = self.create_person('student')
        self.student_2.first_login = False
        self.student_2.save()
        self.student_2_form_data = {'username': self.student_2.user.username,
                                    'password': self.password}

        self.parent_1 = self.create_person('parent')
        self.parent_1_form_data = {'username': self.parent_1.user.username,
                                    'password': self.password}
        self.parent_2 = self.create_person('parent')
        self.parent_2.first_login = False
        self.parent_2.save()
        self.parent_2_form_data = {'username': self.parent_2.user.username,
                                   'password': self.password}

        self.teacher_1 = self.create_person('teacher')
        self.teacher_1_form_data = {'username': self.teacher_1.user.username,
                                    'password': self.password}
        self.teacher_2 = self.create_person('teacher')
        self.teacher_2.first_login = False
        self.teacher_2.save()
        self.teacher_2_form_data = {'username': self.teacher_2.user.username,
                                    'password': self.password}

    def test_homepage_view(self):
        response = Client().get(reverse('yourgrades:homepage'))
        self.assertEqual(response.status_code, 200)
        # Post with clean form or with wrong data -> not redirects
        response = Client().post(reverse('yourgrades:homepage'))
        self.assertEqual(response.status_code, 200)
        response = Client().post(reverse('yourgrades:homepage'),
                                 {'username': 'tester',
                                  'password': 'wrongpass'})
        self.assertEqual(response.status_code, 200)

        # Student redirection tests
        # if first_login field is True -> redirects to FirstLoginView
        self.assertTrue(LoginForm(self.student_1_form_data).is_valid())
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.student_1_form_data, )
        self.assertEqual(response.status_code, 302)
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.student_1_form_data, follow=True)
        self.assertRedirects(response, '/yourgrades/firstlogin')

        # if first_login field is False, redirects to StudentParentView
        self.assertTrue(LoginForm(self.student_2_form_data).is_valid())
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.student_2_form_data, )
        self.assertEqual(response.status_code, 302)
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.student_2_form_data, follow=True)
        self.assertRedirects(response, '/yourgrades/studentparent')
        self.assertTemplateUsed(response, 'yourgrades/studentparent.html')

        # Parent redirection tests
        # if first_login field is True, redirects to FirstLoginView
        self.assertTrue(LoginForm(self.parent_1_form_data).is_valid())
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.parent_1_form_data, )
        self.assertEqual(response.status_code, 302)
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.parent_1_form_data, follow=True)
        self.assertRedirects(response, '/yourgrades/firstlogin')

        # if first_login field is False, redirects to StudentParentView
        self.assertTrue(LoginForm(self.parent_2_form_data).is_valid())
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.parent_2_form_data, )
        self.assertEqual(response.status_code, 302)
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.parent_2_form_data, follow=True)
        self.assertRedirects(response, '/yourgrades/studentparent')
        self.assertTemplateUsed(response, 'yourgrades/studentparent.html')

        # Teacher redirection tests
        # if first_login field is True, redirects to FirstLoginView
        self.assertTrue(LoginForm(self.teacher_1_form_data).is_valid())
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.teacher_1_form_data, )
        self.assertEqual(response.status_code, 302)
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.teacher_1_form_data, follow=True)
        self.assertRedirects(response, '/yourgrades/firstlogin')

        # if first_login field is False, redirects to TeacherPanelView
        self.assertTrue(LoginForm(self.teacher_2_form_data).is_valid())
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.teacher_2_form_data, )
        self.assertEqual(response.status_code, 302)
        response = Client().post(reverse('yourgrades:homepage'),
                                 self.teacher_2_form_data, follow=True)
        self.assertRedirects(response, '/yourgrades/teacher')
        self.assertTemplateUsed(response, 'yourgrades/teacher.html')```

0 个答案:

没有答案