首页 > 解决方案 > 如何测试视图是否能够在数据库中创建新实体?

问题描述

我必须进行基本的单元测试才能使我的代码覆盖率更高。我不需要做任何花哨的事情。只需要最低限度。所以,在这种情况下,如果我能够成功地击中我的视图,那么这就是我需要做的。如您在 models.py 中所见,敏捷团队嵌套在 Team 下。

模型.py -

class Organization(models.Model):
    orgname = models.CharField(max_length = 100, blank=True)

    def __str__(self):
        return str(self.orgname)

class Team(models.Model):
    teamID = models.AutoField(primary_key=True)
    teamName = models.CharField(max_length = 100, blank=True)
    org = models.ForeignKey(Organization, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.teamName)

class AgileTeam(models.Model):
    agileTeamID = models.AutoField(primary_key=True)
    agileTeamName = models.CharField(max_length = 100, blank=True)
    team = models.ForeignKey(Team,  on_delete=models.CASCADE)

    def __str__(self):
        return str(self.agileTeamName)

视图.py -

@csrf_exempt
def newATeam(request):
    if request.method == 'POST':
        param = json.loads(request.body)
        agileteam = param.get('agileteam')
        teamname = param.get('teamname')
        team = Team.objects.get(teamName = teamname)
        AgileTeam.objects.create(agileTeamName=agileteam, team=team)
        return JsonResponse(status = 200, data = {})

urls.py -

path('ajax/newATeam/', views_admin.newATeam, name='ajax_newATeam'),

test_views.py -

class TestViews(TestCase):
@classmethod
    def setUpTestData(self):
        # set-up org
        ORG_NAMES = ['REVCYCSCH', 'DIABLO', 'BROTHERHOOD']
        for org in ORG_NAMES:
            Organization.objects.create(orgname=org)

        # set-up team
        orgModels = Organization.objects.all()
        TEAM_NAMES = ['Blitzkrieg ', 'Hammerheads', 'Mercenaries']
        for i in range(len(TEAM_NAMES)):
            Team.objects.create(teamName=TEAM_NAMES[i], org=orgModels[i])

        # set-up agileteam
        teamModels = Team.objects.all()
        AGILE_TEAM_NAMES = ['Barons', 'Exterminators ', 'Mavericks', 'Renegades', 'Stratosphere', 'Trojans ']
        index = 0
        for team in teamModels:
            for _ in range(2):
                AgileTeam.objects.create(agileTeamName=AGILE_TEAM_NAMES[index], team=team)
                index = index + 1

        self.client = Client()

        def test_newATeam(self):
            params = {'agileteam': 'Barons', 'teamname': 'Blitzkrieg'}
            response = self.client.post(path = '/ajax/newATeam/', data = params, content_type = 'application/json')
            self.assertEqual(response.status_code, 200) 

但是,我收到此错误 - 错误

提前致谢!

标签: pythondjangounit-testing

解决方案


我会做一些稍微不同的事情。

views.py

@csrf_exempt
def new_agile_team(request):
    if request.method == 'POST':
        if request.META.get('CONTENT_TYPE', '').lower() == 'application/json' and len(request.body) > 0:
            try:
                body_data = json.loads(request.body.decode('utf-8'))
            except Exception as e:
                return HttpResponseBadRequest(json.dumps({
                    'error': 'Invalid request: {0}'.format(str(e))
                 }), content_type="application/json")

        try:
            team = Team.objects.get(teamName = teamname)
            AgileTeam.objects.create(agileTeamName=agileteam, team=team)
        except Team.DoesNotExist as error:
            # Handle error here...

        return JsonResponse(status = 200, data = {})

但是,我强烈建议为此使用 Djago REST 框架 - 因为您可能只需要为登录用户提供创建团队的能力,因此您需要了解@action路由的级别权限,以及使用更多的 RESTful 原则。


推荐阅读