【问题标题】:Testing a query parameter in django restframework在 django rest 框架中测试查询参数
【发布时间】:2021-01-17 16:04:22
【问题描述】:

我正在测试 djnago restframework 中的查询参数以检索对象的详细信息。查询在浏览器中有效,但在测试中无效。我认为我没有正确调用响应:

    response = self.client.get(reverse('quote-requests:get-calculator-detail', kwargs={'calculator_code': self.calc1.calculator_code}))

应用程序 urls.py

       
    from django.contrib import admin
    from django.urls import path, include

    urlpatterns = [
        path('api/v1/quote-requests/', include('quote_requests.urls')),
    ]

其中包括quotes.urls.py


    from django.urls import path, include
    from rest_framework.routers import DefaultRouter

    from quote_requests import views 

    router = DefaultRouter()
    router.register('get-calculator', views.CalculatorCodeDetailViewSet, basename='get-calculator')

    app_name = 'quote-requests'

    urlpatterns = [
        path('', include(router.urls)),
    ]

视图集是:


    class CalculatorCodeDetailViewSet(viewsets.ReadOnlyModelViewSet):

        serializer_class        = CalculatorCodeSerializer

        lookup_field            = ('calculator_code')
        
        def get_queryset(self):
            return (
                Calculator.objects.filter(
                    calculator_code = self.request.query_params.get('calculator_code',)
                    )
            )

CalculatorCodeSerializer 是:

    class CalculatorCodeSerializer(serializers.ModelSerializer):


        class Meta:
            model = Calculator
            fields = (
                'name',
                'calculator_code',
                )

测试是:


    def test_retrieving_calculator_detail_with_calculator_code(self):
            ''' test retrieving detail of a calculator '''
            self.calc1 = Calculator.objects.create(
                name                =  "Calculator 1000",
                calculator_code     = "HH1000",
            )

            response = self.client.get(reverse('quote-requests:get-calculator-detail', kwargs={'calculator_code': self.calc1.calculator_code}))

            serializer = CalculatorCodeSerializer(self.calc1)

            self.assertEqual(response.data, serializer.data)

这会产生错误:


    Traceback (most recent call last):
    File "/app/quote_requests/tests/test_calculators_api.py", line 149, in test_retrieving_calculator_detail_with_calculator_code
        self.assertEqual(response.data, serializer.data)
    AssertionError: {'detail': ErrorDetail(string='Not found.',[14 chars]nd')} != {'name': 'Calculator 1000', 'calculator_cod[368 chars].25'}


查看浏览器链接时:


    http://localhost:8000/api/v1/quote-requests/get-calculator/?calculator_code=HH1000

这可行,但测试失败。任何正确设置的帮助将不胜感激。

【问题讨论】:

    标签: django testing django-rest-framework


    【解决方案1】:

    我认为您使用了错误的端点名称将此“get-calculator-detail”替换为“get-calculator” def test_retrieving_calculator_detail_with_calculator_code(self): # test retrieving detail of a calculator self.calc1 = Calculator.objects.create( name = "Calculator 1000", calculator_code = "HH1000", ) response = self.client.get(reverse('quote-requests:get- calculator', kwargs={'calculator_code': self.calc1.calculator_code})) serializer = CalculatorCodeSerializer(self.calc1) self.assertEqual(response.data, serializer.data)

    【讨论】:

    • 感谢您的回答,但这不是问题所在,否则会引发另一个引发“raise NoReverseMatch(msg)”的问题......我相信是因为模型视图 ReadOnlyModelViewSet 的魔力使得 -detail 需要逆向法
    【解决方案2】:

    在 Fiverr 上其他人的帮助下,我通过了测试。我不愿将其称为已回答,但我将详细信息放在这里,以防那些知道更好方法的人发表评论。

    TLDR - 响应变量没有正确写入,或者反向没有做我想要的,或者它不能用反向来完成。无论哪种方式,有效的更改是:

    response = self.client.get('/api/v1/quote-requests/get-calculator/', {'calculator_code': self.calc1.calculator_code})

    这不会返回可迭代对象。它返回一个 OrderDict,如下所示:

    [{"name":"Calculator 1000","calculator_code":"HH1000","id":7,}]

    我使用 print(response.content) 来检查这个。

    所以您需要使用 json 函数将数据拉出并匹配到 serializer.data - 来自序列化程序的响应。

    response.data = response.json()[0]

    这会关闭“[]”并将其格式化为:

    {'name': 'Calculator 1000', 'calculator_code': 'HH1000', 'id': 7, }

    最后的[0]获取对象(我认为)并以json格式返回。

    帮助我解决此问题的两个 Fiverr 用户是: https://www.fiverr.com/tailongk 和 https://www.fiverr.com/asipita

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 1970-01-01
      • 2014-06-28
      • 2015-04-19
      • 1970-01-01
      • 2017-09-24
      • 2019-12-24
      • 2015-03-29
      • 2016-01-25
      相关资源
      最近更新 更多