Django REST Framework - 在 ApiClient 的序列化器测试中设置请求

标签 django testing django-rest-framework django-serializer

我已经读过:Django REST Framework - Set request in serializer test? 。而且这对我不起作用!因为我使用的是 APIClient 而不是像他那样使用 RequestFactory。

我构建了一个 Web 应用程序,其中后端是使用 Django REST Framework 实现的。现在我正在编写单元测试,并且在测试序列化器方法时遇到了问题。这是我正在努力解决的序列化器方法的一个示例:

def get_can_edit(self, obj):
  request = self.context['request']
  user = User.objects.get(username=request.user)
  return user == obj.admin

当尝试从测试中调用它时,首先我声明序列化器的一个实例:

但现在我需要 self.serializer 在 get_can_edit 执行 self.context.get('request') 时获得正确的请求。我使用 APIClient 创建了一个包含正确信息的虚假请求:

self.client = APIClient()
self.client.force_authenticate(user)
conference = a_fake_conference

res = self.client.get('conference:conference-detail'. args=[conference.id])
serializer = ConferenceSerializer(conference, context={WHAT_IS_REQUEST?}) 
# I'm using a dict as context but the request gave me an error: context={'request': { 'user': user }}

sert.assertEqual(res.data, serializer.data)

现在我陷入困境,因为我不确定如何将 request1 添加到序列化器,以便 request = self.context['request'] 将返回

谢谢。

最佳答案

使用wsgi_request (source code-Django) APIClient 来获取 WSGI 请求对象。

self.client = APIClient()
self.client.force_authenticate(user)
res = self.client.get('conference:conference-detail'. args=[conference.id]
# make sure to call the `get(...)` method before accessing `wsgi_request` attribute
<b>request_object = res.wsgi_request</b>

免责声明:不确定这是否是获取request对象的DRF方式。

关于Django REST Framework - 在 ApiClient 的序列化器测试中设置请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60106359/

相关文章:

linux - 如何测试程序无法连接到 Internet 时的行为?

python - Django Rest Framework - 如何在 ModelSerializer 中添加自定义字段

python - 通过模型 Django 在嵌套序列化器中包含额外的字段

node.js - 如何使用 ChainCode Mock Stub 测试 Node js 链码

python - Selenium:元素不可点击......其他元素将收到点击

ruby-on-rails - Cucumber 和 Rspec 共享工厂女孩工厂

django - 在 Django Rest Framework 中上传文件并处理 zip 请求

django - 如何使用 django rest 框架作为移动应用程序的后端

Django Rest 更改 URL 中的主键以使用自定义键

python - 从日期时间列表中获取最早和最晚时间