python - 如何在 Django Rest Framework 测试中强制进行身份验证

标签 python django rest django-rest-framework frameworks

我在测试 DRF 教程中内置的 API 时遇到问题:https://www.django-rest-framework.org/tutorial/1-serialization/

我有观点:

class SnippetList(generics.ListCreateAPIView):
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

以及用于测试该 View 的测试类:

class SnippetsList(APITestCase):
    def setUp(self):
        self.user = User.objects.create_superuser(username='testowy', password='test')
        self.client = APIClient()
        Snippet.objects.create(code="print('hello')", owner=self.user)
        Snippet.objects.create(code="print('world')", owner=self.user)
        self.payload = {
            "code": "print(edit)"
        }

    def test_get_snippets_list(self):
        response = self.client.get(reverse('snippet_list'))
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        self.assertEqual(response.data, serializer.data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_post_snippets_list(self):
        self.client.force_authenticate(self.user)
        response = self.client.post(reverse('snippet_list'), json.dumps(self.payload), format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

当我使用 python manage.py test 运行测试时,第一个测试(对于 get 方法)正在通过,但第二个测试我得到以下输出:

    self.assertEqual(response.status_code, status.HTTP_201_CREATED) AssertionError: 400 != 201

在登录后的手动测试中,一切正常,有人知道我在这里缺少什么吗?

最佳答案

force_authenticate 在 setUp 方法内部调用。

更好的做法可能是为 PublicTests 创建一个类,该类将拥有普通用户。

然后创建一个名为 PrivateTests 的新类,您将在 setUp() 内部强制进行身份验证

def setUp(self):
    self.user = User.objects.create_superuser(username='testowy', password='test')
    self.client = APIClient()
    self.client.force_authenticate(user=self.user)

def test_get_snippets_list(self):
    """Test creating and listing snippet objects."""

    snippet1 = Snippet.objects.create(code="print('hello')", owner=self.user)
    snippet2 = Snippet.objects.create(code="print('world')", owner=self.user)

    user = self.user
    res = self.client.get(reverse("snippet_list"))

    self.assertEqual(res.status_code, status.HTTP_200_OK)
    self.assertEqual(user.snippets.count(), 2)
    self.assertIn(snippet1, user.snippets.all())
    self.assertIn(snippet2, user.snippets.all())

关于python - 如何在 Django Rest Framework 测试中强制进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66993698/

相关文章:

java - Google App Engine - HttpClient 执行方法关闭连接而不获取数据

python - Django urlpatterns - 太多值无法解压

python - 如何从python中的列表中获取唯一值

python - 在 Python 中使用 'nearest' 方法进行外推

Django:表单 GET 有 "field required"错误,而 POST 没有

java - 如何使用 Jersey (REST) 读取 GET 请求的输入 XML?

python - 从过程中排除某些尺寸的图像(OpenCV、Python)

python - Django 管理更改列表页面中未选择新行 (\n)

python - Django bool 字段获取查询给出关键错误

spring - 在 Kotlin 上使用 WebTestClient 和 SpringBootTest 时出现 "lateinit property <varName> has not been initialized"