首页 > 解决方案 > 如何进行 Django 单元测试 - 通过 1 个类重用来自 1 个数据库的数据

问题描述

正如您在 setUpClass 中看到的,我们定义了用户和配置文件。

当您查看方法时:

test_create_project

一切正常,测试通过。想法是因为项目和职位是通过该方法创建的,我想在方法中从数据库中使用它:

test_homepage

问题是当您尝试从 DB 中读取它们时,它们不再存在。我的问题是为什么。我知道我是否在

setUpClass

那么它将在数据库中。我的意思不是创建额外的项目和位置,如果我可以通过该方法第一次创建它 - 测试它然后在下一个方法中重用它 - 但不是通过使用 (self) 而是通过从数据库读取。

问题1:

Is that possible?

问题2:

Are methods in this class using separated DBes?

问题3:

What is the most efficient - and proper approach to this - my point is not to create extra records and reuse data as we go.

这些在 test_homepage 方法中为空:

    print(project)
    print(positions)

Django 2.2 测试:

from django.contrib.auth.models import User
from django.test import TestCase
from django.utils import timezone

from stb.core.models import Profile, Skill, Project, Position

class EntireAppTest(TestCase):

    """Updating Profile"""

    @classmethod
    def setUpClass(cls):
        """Creating User"""
        super().setUpClass()
        cls.user = User.objects.create_user(
            username='johnconnor',
            email='dude@nasa.gov',
            password='terminator'
        )
        cls.profile = Profile.objects.get(user=cls.user)
        skill = Skill()
        skill.save()
        skill.profile.add(cls.profile.id)
        skill.title='python'
        skill.save()

    def setUp(self):
        self.client.login(username='johnconnor', password='terminator')


    def test_create_account(self):
        self.user = User.objects.get(email='dude@nasa.gov')
        self.assertEqual(User.objects.count(), 1)
        self.assertEqual(self.user.username, 'johnconnor')
        self.assertEqual(self.user.email, 'dude@nasa.gov')


    def test_create_profile(self):
        self.profile = Profile.objects.get(user=self.user)
        now = timezone.now()
        self.assertLess(self.profile.pub_date, now)

    def test_create_project(self):
        url = '/project/new/'
        response = self.client.post(
            url,
            data={
                'profile': self.profile,
                'title': 'NASA JPL',
                'position_formset-TOTAL_FORMS': 1,
                'position_formset-INITIAL_FORMS': 0,
                'position_formset-0-title': 'Python Developer',
                'position_formset-0-description': 'description',
            },
        )
        project = Project.objects.get(id=1)
        position = Position.objects.get(project=project)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(project.title, 'NASA JPL')
        self.assertEqual(position.title, 'Python Developer')

    def test_homepage(self):
        url = '/'
        response = self.client.get(
            url,
            data={},
        )
        positions = Position.objects.all()
        project = Project.objects.all()
        print(project)
        print(positions)
        # print(response.context)
        self.assertEqual(response.status_code, 200)

标签: djangodatabaseunit-testingdjango-testingdjango-tests

解决方案


推荐阅读