【问题标题】:Access basket from view called with unit test in Django Oscar在 Django Oscar 中使用单元测试调用视图访问购物篮
【发布时间】:2018-11-01 06:38:29
【问题描述】:

如何将在单元测试中创建的 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'))

【问题讨论】:

    标签: django django-rest-framework django-oscar


    【解决方案1】:

    你可以这样做:

    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/

    【讨论】:

      【解决方案2】:

      对于普通请求oscar.apps.basket.middleware.BasketMiddleware将购物篮添加到请求中,因此您可能需要检查您的测试项目正在使用的settings.MIDDLEWARE,或者APITestCase提供的客户端正在运行中间件。

      如果您正在开发 API,您可能还想了解 django-oscar-api 处理会话管理和中间件的方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-26
        • 2011-06-15
        • 1970-01-01
        相关资源
        最近更新 更多