Можно ли избежать необходимости аутентификации при тестировании Django Rest Framework - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь использовать DRF-тестирование впервые, поэтому я создал следующий TestCase:

class TestInventoryActionInputNoSeriable(TestCase):
    def setUp(self):
        self.repository = create_repository()
        self.not_seriable_product = create_not_seriable_product()

    def test_post_inventory_input_not_seriable(self):
        client = APIClient()

        response = client.post('/api/inventory/execute_action/', {
            'action': 'input',
            'repository': self.repository.id,
            'product': self.not_seriable_product.id,
            'amount': 1,
        })
        self.assertEqual(response.status_code, 200)

        inventory_actions = models.InventoryAction.objects.all()
        inventory_inputs = models.InventoryInput.objects.all()
        kardexs = models.Kardex.objects.all()

        self.assertEqual(len(inventory_actions), 1)
        self.assertEqual(len(inventory_inputs), 1)
        self.assertEqual(len(kardexs), 1)

        inventory_action = inventory_actions.first()
        inventory_input = inventory_inputs.first()
        kardex = kardexs.first()

        self.assertEqual(inventory_action.action_content_type.model, 'inventoryinput')
        self.assertEqual(inventory_action.action_object_id, inventory_input.id)
        self.assertEqual(kardex.type, models.KARDEX_INPUT)
        self.assertEqual(kardex.repository_id, self.repository_id)
        self.assertEqual(kardex.product_id, self.not_seriable_product.id)
        self.assertEqual(kardex.amount, 1)
        self.assertEqual(kardex.stock, 1)

Но я получаю следующий результат:

(TCDigitalVenv) MacBook-Pro-de-Hugo:TCDigital hugovillalobos$ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_post_inventory_input_not_seriable (inventory.tests.TestInventoryActionInputNoSeriable)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/hugovillalobos/Documents/Code/TCDigitalProject/TCDigitalBackend/TCDigital/inventory/tests.py", line 31, in test_post_inventory_input_not_seriable
    self.assertEqual(response.status_code, 200)
AssertionError: 401 != 200

----------------------------------------------------------------------
Ran 1 test in 0.083s

FAILED (failures=1)
Destroying test database for alias 'default'...

Что означает, что запрос был отклонен из-за ошибки аутентификации. Я следовал Документация по аутентификации DRF :

def test_post_inventory_input_not_seriable(self):
        token = Token.objects.get(user__username='admin')
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='token '+token.key)

        response = client.post('/api/inventory/execute_action/', {
            'action': 'input',
            'repository': self.repository.id,
            'product': self.not_seriable_product.id,
            'amount': 1,
        })
        self.assertEqual(response.status_code, 200)
        ...

Но я получаю эту ошибку:

(TCDigitalVenv) MacBook-Pro-de-Hugo:TCDigital hugovillalobos$ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: test_post_inventory_input_not_seriable (inventory.tests.TestInventoryActionInputNoSeriable)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/hugovillalobos/Documents/Code/TCDigitalProject/TCDigitalBackend/TCDigital/inventory/tests.py", line 23, in test_post_inventory_input_not_seriable
    token = Token.objects.get(user__username='admin')
  File "/Users/hugovillalobos/Documents/Code/TCDigitalProject/TCDigitalBackend/TCDigitalVenv/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/hugovillalobos/Documents/Code/TCDigitalProject/TCDigitalBackend/TCDigitalVenv/lib/python3.7/site-packages/django/db/models/query.py", line 408, in get
    self.model._meta.object_name
rest_framework.authtoken.models.Token.DoesNotExist: Token matching query does not exist.

----------------------------------------------------------------------
Ran 1 test in 0.046s

FAILED (errors=1)
Destroying test database for alias 'default'...

Я не знаю, нужно ли мне создавать пользователя каждый раз, когда я Запустите тест, если есть способ избежать проверки подлинности для тестирования.

1 Ответ

0 голосов
/ 22 марта 2020

Вы должны создать пользователя для каждого теста, чтобы иметь возможность войти в систему. Но вы можете войти в него гораздо проще:

admin = User.objects.create_user(...)
self.client.force_login(admin)
response = client.post(...)

Это принудительно войдет в систему пользователя во время вашего теста, и API будет считать его вошедшим в систему (не нужно отправлять заголовки и прочее по запросу) .

self.client в основном APIClient() для текущего TestCase.

...