gpt4 book ai didi

使用 APIRequestFactory : how to pass "flat" parameter to a view 进行 Django 测试

转载 作者:行者123 更新时间:2023-11-28 21:16:54 26 4
gpt4 key购买 nike

Django 2.2

我正在使用 APIRequestFactory 为 API 编写测试。命中的代码 /some_endpoint/some_endpoint/<item_id>已经有效,测试 /some_endpoint 的测试也是如此.然而测试要测试/some_endpoint/<item_id>不起作用,因为我找不到通过 <item_id> 的有效方法查看代码的值。请注意,这不是 /some_endpoint/<some_keyword>=<item_id> ,在我的例子中它是“扁平的”,即没有关键字。问题是<item_id>没有进入 View 代码(在 None 方法的类 View 中总是 get_queryset)

我试图将其传递为 **kwargs , 它也没有到达(见 here )。但是,如果没有关键字,那可能无论如何都行不通。

我尝试改用 Client 而不是 APIRequestFactory,结果相同。但我宁愿让它与 APIRequestFactory 一起工作,除非它通常不会以这种方式工作。下面是代码。

测试.py

def test_getByLongId(self) :
factory = APIRequestFactory()
item = Item.active.get(id=1)
print(item.longid)
#it prints correct longid here

request = factory.get("/item/%s" % item.longid)
view = ItemList.as_view()
force_authenticate(request, user=self.user)
response = view(request)

网址.py

urlpatterns = [
...
...
url(item/(?P<item_id>[a-zA-Z0-9-]+)/$', views.ItemList.as_view(), name='item-detail'),
...
...
]

View .py

class ItemList(generics.ListAPIView):
permission_classes = (IsBotOrReadOnly,)

"""
API endpoint that allows users to be viewed or edited.
"""
serializer_class = ItemSerializer

schema = AutoSchema(
manual_fields=[
coreapi.Field("longid"),
]
)

def get_queryset(self):
"""
Optionally restricts the returned SampleSequencing to a given barcode.
"""
longid = self.kwargs.get('item_id', None)

print(longid)
#prints correct longid when executed by the webserver code and prints None when executed by the test

queryset = Item.active.filter(longid=longid)
return queryset

最佳答案

您必须将 item_id 传递到 view() 中:

def test_by_long_id(self) :
factory = APIRequestFactory()
item = Item.active.get(id=1)
print(item.longid)
#it prints correct longid here

request = factory.get("/item/%s" % item.longid)
view = ItemList.as_view()
force_authenticate(request, user=self.user)
response = view(request, item_id=item.longid)

或使用 APIClient:

from rest_framework.test import APIClient

# ...
#
def test_item_client(self):
item = Item.active.get(id=1)
client = APIClient()
url = '/item/%s/' % item.id
response = client.get(url)

关于使用 APIRequestFactory : how to pass "flat" parameter to a view 进行 Django 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56560504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com