我正在为我的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
我不知道为什么我的测试因未授权状态代码而失败。
那么,有什么问题,我该如何解决?
答案 0 :(得分:1)
问题源于您在测试用例中模拟登录的方式。
您正在使用login()
类的APIClient
方法,该方法适用于拥有SessionAuthentication
的人。
来自the docs:
login
方法适用于测试使用会话身份验证的API,例如包含与API进行AJAX交互的网站。
但是在您看来,您使用的是BasicAuthentication
(which 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应该成功通过。