【问题标题】:Django [AssertionError: 401 != 201]Django [AssertionError: 401 != 201]
【发布时间】:2019-06-16 13:21:47
【问题描述】:

我正在为我的 API 编写测试。现在我想测试 post 方法。

这是我的views.py

class TaskViewSet(viewsets.ModelViewSet):

    queryset = Task.objects.all()
    serializer_class = serializers.TaskSerializer
    authentication_classes = (BasicAuthentication,)
    permission_classes = (permissions.IsAuthenticated, permissions.IsAdminUser)

这是我的tests.py

class UserFactory(DjangoModelFactory):

    class Meta:
        model = User

    username = 'dima'
    password = 'moonmvm2k14'
    email = 'admin@admin.com'
    is_superuser = True
    is_active = True
    is_staff = True


class TaskFactory(DjangoModelFactory):

    class Meta:
        model = Task

    title = "TASK N1"
    description = "smth"
    person = factory.SubFactory(UserFactory)
    deadline = date.today()


class ViewTest(APITestCase):

    def setUp(self):
        self.task = TaskFactory()

        self.username = 'myuser'
        self.password = 'test' 
        self.email = 'admin@mgmail.com'

        self.admin = User.objects.create_superuser(self.username, self.password, self.email)

        self.client = APIClient()
        self.client.login(username=self.admin.username, password=self.admin.password)

    def test_post_task(self):
        url = '/task-list/'
        json_tasks = serializers.TaskSerializer(self.task)
        data = json_tasks.data
        response = self.client.post(url, data)
        tasks_count = Task.objects.count()
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(tasks_count, 2)

但是当我尝试测试它时,我看到了这个错误:

AssertionError: 401 != 201

我不知道为什么我的测试失败并显示未授权状态代码。

那么,问题出在哪里,我该如何解决?

【问题讨论】:

  • /task-list/ URL 似乎给了你 HTTP 401,你能打印出响应正文并将其添加到问题中吗?
  • 需要打印response.body才能获取正文字符串
  • 'Response' 对象没有属性 'body' 如果你想查看 response.data,请购买,这里是:'detail': ErrorDetail(string='Authentica[59 chars]ed')跨度>

标签: django python-3.x django-rest-framework factory-boy


【解决方案1】:

问题源于您在测试用例中模拟登录的方式。

您正在使用APIClient 类的login() 方法,当您有SessionAuthentication 时该方法适用。

来自the docs

login 方法适用于测试使用会话身份验证的 API,例如包含 AJAX 与 API 交互的网站。


但是在你看来你使用BasicAuthenticationwhich is actually only suitable for testing purposes),所以你可以使用客户端类的另一种方法——force_authenticate

class ViewTest(APITestCase):
    def setUp(self):
        ...

        self.client = APIClient()
        self.client.force_authenticate(user=self.admin)

这将使您的管理员用户真正登录并且状态代码断言应该成功通过。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2019-08-27
    • 2022-01-23
    • 2015-06-07
    • 2014-03-12
    • 2020-07-12
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多