AttributeError: у объекта 'NoneType' нет атрибута 'get', хотя у меня есть экземпляр класса, который я использую - PullRequest
0 голосов
/ 19 апреля 2019

Когда я запускаю тест, следующий:

def test_match_data_while_updating(self):
    match_updated_data = {
        'id': 1,
        'status': 'not_started',
    }    
    match = Match.objects.first()

    # TST N.1 : status not_started
    # -------
    match.status = 'not_started'
    request = self.__class__.factory.put('', match_updated_data, format='json')        
    add_authentication_to_request(request, is_staff=True)
    response = update_match_video(request)
    self.assertEqual(Match.objects.first().status,'live')

Я получаю сообщение об ошибке:

print ('запрос данных get match:', request.data.get ('match'). Get ('id'))

AttributeError: объект 'NoneType' не имеет атрибута 'get'

Вот функция, которую я тестирую:

def update_match_video(request):
   print('request data get match: ',request.data.get('match').get('id'))
   if not request.data.get('match').get('id'):
     return JsonResponse({}, status=status.HTTP_400_BAD_REQUEST)

   try:
     match_id = valid_data_or_error(request.data, method='PUT')['match_data']['id']
     match = Match.objects.get(id = match_id)
     db_match_status = match.status

     if db_match_status == 'live':
        valid_data_or_error(request.data, method='PUT')['match_data']['status'] = 'live'
     else:
        if db_match_status == 'closed':
            valid_data_or_error(request.data, method='PUT')['match_data']['status'] = 'closed'
   except Match.DoesNotExist:
      print('Match does  not exist')

Буду признателен за помощь, пожалуйста!

1 Ответ

0 голосов
/ 19 апреля 2019

Итак, request.data имеет значение None:

Один из способов убедиться, что вы нажали на функцию, которая принимает аргумент запроса, - это использовать тестовый клиент Django и быть уверенным, что PT получит ожидаемое вами значение:

from django.test import Client
from django.test import TestCase
... other import as needed

class TestMyFunc(TestCase):
    def setUp(self):
        self.client = Client()

    def test_match_data_while_updating(self):
        match_updated_data = {
        'id': 1,
        'status': 'not_started',
        }    
        match = Match.objects.first()

        # TST N.1 : status not_started
        # -------
        match.status = 'not_started'
        response = self.client.put( .... ) ## JSON of put data -- make certain to PUT "{ .., match: "something!", ..}
        self.assertEqual(response.status_code, 200)
        ... other assertions

Теперь это создает тестовую базу данных (и не должно иметь побочных эффектов (модульный тест, а не интеграционный тест)) и может надежно повторяться.

Чтобы заставить django запустить этотtest поместите его в каталог с именем tests в основной директории проекта (рядом с представлениями, моделями и т. д.) и выполните python manage.py run tests

Надеюсь, что это поможет

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