Доступ к корзине из вида вызван с модульным тестом в Джанго Оскар - PullRequest
0 голосов
/ 01 ноября 2018

Как прикрепить корзину Django Oscar, созданную в модульном тесте, к объекту request?

# views.py

from django.contrib.auth.mixins import LoginRequiredMixin

from rest_framework.response import Response
from rest_framework.views import APIView

class BasketAPIAddView(LoginRequiredMixin, APIView):
    """
    Update basket via REST API.
    """
    def delete(self, request, format=None):
        #
        # cannot access `request.basket` here
        #
        return Response({})

# tests.py

from django.contrib.auth import get_user_model
from django.urls import reverse
from oscar.test.factories import create_basket
from rest_framework.test import APITestCase

User = get_user_model()

class BasketAPITests(APITestCase):
    """
    Basket view test cases.
    """
    def test_remove_basket_line(self):
        basket = create_basket()
        basket.owner = User.objects.create_user('user', password='pass')
        basket.save()

        self.client.login(username='user', password='password')
        self.client.delete(reverse('delete-basket'))

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вы можете сделать что-то вроде:

from django.contrib.auth import get_user_model

from rest_framework import status
from rest_framework.test import APIRequestFactory
from oscar.test.factories import create_basket


User = get_user_model()

class BasketAPITests(APITestCase):

    def test_remove_basket_line(self):
        """Check the method BasketAPIAddView.delete works as should."""

        # Create the request, note the  .delete which is the operation (BasketAPIAddView.delete)
        request = APIRequestFactory().delete(reverse('<your url name>'))

        # Create the basket
        basket = create_basket()
        basket.owner = User.objects.create_user('user', password='pass')
        basket.save()

        # Attach the basket to the request obj
        request.basket =  create_basket()

        # Call the endpoint, with the proper request obj
        response = BasketAPIAddView.as_view()(request)

        # Some verifications
        ...
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        ...

Ключ должен использовать фабрику запросов и иметь объект по вашему желанию (добавляя то, что вам нужно).

Более подробную информацию вы можете найти на https://www.django -rest-framework.org / api-guide / testing /

0 голосов
/ 01 ноября 2018

Для обычных запросов oscar.apps.basket.middleware.BasketMiddleware добавляет корзину к запросу, поэтому, возможно, вам нужно проверить settings.MIDDLEWARE, который используется в вашем тестовом проекте, или что на клиенте, предоставленном APITestCase, запущено промежуточное ПО.

Если вы разрабатываете API, вам также может понадобиться посмотреть, как django-oscar-api управляет сессионным управлением и промежуточным программным обеспечением.

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