当使用mongodb后端为Django rest框架API运行py.test时,遇到了一个问题,而视图实际上是在运行。
如果我启动服务器,则API会按预期工作。仅在运行测试时,因为self._cursor
是列表而不是迭代器,它才会失败。
我想知道pymongo的mongomock和Django rest框架的分页是否有关。
以下是设置:
settings_test.py
# override the mongodb with mocks for pytest
mongoengine.register_connection(
'default',
name='testing',
host='mongomock://localhost',
# let datetime in pymongo/mongoengine with timezone information
tz_aware=True)
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
查看测试中
from rest_framework_mongoengine.generics import ListAPIView
class ListPropertyApi(ListAPIView):
queryset = PropertyObject.objects.all()
serializer_class = PropertySerializer
pytest
class TestListPropertyApi:
def test_lonlat_query(self, rf):
request = rf.get(
u'/property/list/')
view = views.ListPropertyApi.as_view()
response = view(request)
错误信息
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py:58: in wrapped_view
return view_func(*args, **kwargs)
/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py:68: in view
return self.dispatch(request, *args, **kwargs)
/usr/local/lib/python2.7/dist-packages/rest_framework/views.py:466: in dispatch
response = self.handle_exception(exc)
/usr/local/lib/python2.7/dist-packages/rest_framework/views.py:463: in dispatch
response = handler(request, *args, **kwargs)
share/cache.py:96: in get
return decorated_get(self, request, *args, **kwargs)
lib/rest_framework_mongoengine/generics.py:77: in get
return self.list(request, *args, **kwargs)
/usr/local/lib/python2.7/dist-packages/rest_framework/mixins.py:42: in list
page = self.paginate_queryset(queryset)
/usr/local/lib/python2.7/dist-packages/rest_framework/generics.py:172: in paginate_queryset
return self.paginator.paginate_queryset(queryset, self.request, view=self)
/usr/local/lib/python2.7/dist-packages/rest_framework/pagination.py:448: in paginate_queryset
results = list(queryset[offset:offset + self.page_size + 1])
/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/queryset.py:80: in _iter_results
self._populate_cache()
/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/queryset.py:92: in _populate_cache
self._result_cache.append(self.next())
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = .. queryset mid-iteration ..
def next(self):
"""Wrap the result in a :class:`~mongoengine.Document` object.
"""
if self._limit == 0 or self._none:
raise StopIteration
> raw_doc = self._cursor.next()
E AttributeError: 'list' object has no attribute 'next'
/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/base.py:1407: AttributeError
环境
mongoengine==0.10.6
mongomock==3.3.0
pymongo==3.2.2
djangorestframework==3.3.3
pytest-django==2.9.1
Django==1.9.4
最佳答案
我有一个类似的问题,通过遵循此问题https://github.com/vmalloc/mongomock/issues/130可以轻松解决
关于python - 带有mongomock的py.test中的self._cursor.next()异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37289456/