Как проверить, может ли view создать новую сущность в БД? - PullRequest
2 голосов
/ 02 апреля 2020

Мне нужно пройти базовое c модульное тестирование, чтобы увеличить охват моего кода. Мне не нужно делать что-то модное. Требуется только минимум. Таким образом, в этом случае, если я смогу ударить по своему мнению, то это все, что мне нужно сделать. Команда Agile вложена в Team, как вы можете видеть в файле models.py.

models.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)

views.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) 

Однако я получаю эту ошибку - Ошибка

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Итак ... вы отправляете 'teamName': 'Blitzkrieg', но затем вы получаете teamname = param.get('teamname') ... конечно, это не сработает, вы даже пытались его отладить?

Я вижу так много проблем с этим кодом, который я просто не знаю, с чего начать, но просто для начала начните использовать PEP8 + Djagno Coding стили (+ может быть, немного linter & formatter) и ваш жизнь станет намного проще.

0 голосов
/ 02 апреля 2020

Есть несколько вещей, которые я бы сделал немного по-другому.

В 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 = {})

Однако я настоятельно рекомендую использовать для этого Dja go REST framework - так как вам может потребоваться предоставить только зарегистрированным пользователям возможность создавать команды, поэтому вам нужно понимать разрешения на уровне @action на маршрутах, а также использовать более RESTful-принцип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...