Django [AssertionError:401!= 201]

时间:2019-06-16 13:21:47

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

我正在为我的API编写测试。现在我要测试发布方法。

这是我的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

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

那么,有什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:1)

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

您正在使用login()类的APIClient方法,该方法适用于拥有SessionAuthentication的人。

来自the docs

  

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


但是在您看来,您使用的是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)

这将使您的管理员用户实际登录,并且状态代码assert应该成功通过。