在Django Rest Framework中使用身份验证测试POST

时间:2017-03-22 22:51:11

标签: python django unit-testing django-rest-framework

我正在尝试将POST数据测试到django-rest-framework中需要身份验证的视图。但我不能。我已经阅读了很多假设的解决方案,但找不到任何可以解决的问题。

串行:

class ResearcherSerializer(serializers.ModelSerializer):
    studies = serializers.PrimaryKeyRelatedField(
        many=True, queryset=Study.objects.all()
    )

    class Meta:
        model = Researcher
        fields = ('id', 'first_name', 'surname', 'email', 'studies')

查看:

class ResearcherSerializer(serializers.ModelSerializer):
    studies = serializers.PrimaryKeyRelatedField(
        many=True, queryset=Study.objects.all()
    )

    class Meta:
        model = Researcher
        fields = ('id', 'first_name', 'surname', 'email', 'studies')

测试:

class ResearcherAPITest(APITestCase):
    base_url = reverse('api_researchers')
# ...

def test_POSTing_a_new_researcher(self):
    user = User.objects.create(username='lab1', password='nep-lab1')
    self.client.login(username=user.username, password=user.password)
    response = self.client.post(
        self.base_url,
        {
            'first_name': 'João',
            'surname': 'das Rosas',
        }
    )
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)
    new_researcher = Researcher.objects.first()
    self.assertEqual(new_researcher.first_name, 'João')
    self.client.logout()

我收到此错误:

FAIL: test_POSTing_a_new_researcher (experiments.tests.test_api.ResearcherAPITest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/caco/Workspace/nep-system/nep/experiments/tests/test_api.py", line 130, in test_POSTing_a_new_researcher
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)
AssertionError: 403 != 201

----------------------------------------------------------------------

已阅读drf测试文档,但看不出我做错了什么。

3 个答案:

答案 0 :(得分:5)

创建用户的正确方法是使用User.objects.create_user()作为教导official Django documentation。使用create_user()方法时,密码参数在保存到数据库之前进行哈希处理,而常见的create()方法不会这样做。

此外,还必须使用

登录
self.client.login(username=user.username, password='nep-lab1')
{/ 1}} user.password password参数APIClient.client.login()参数,如@ oz-main所述。

答案 1 :(得分:1)

我认为您无法按照自己的意愿访问user.password。另外,我给出了一些建议:

  • 由于您正在使用APITestCase。尝试使用setUp方法在数据库中创建用户。这样,您就可以在其他情况下重复使用该用户
  • 按照pep8指南编写代码。test_POSTing_a_new_researcher是一个非常奇怪的方法名称
  • 看看factory boy,通过更换夹具方法可能会让您的生活更轻松

良好的测试资源:http://www.obeythetestinggoat.com/

答案 2 :(得分:1)

基于您编写的测试用例 测试用户未登录,因为您尝试使用散列密码而不是nep-lab1登录用户。您可以通过以下方式测试您是否已成功登录:

print self.client.login(username=user.username, password=`nep-lab1`)
# True if logged in and False if not

并且由于用户未通过api发布新研究员的测试结果将导致FORBIDDEN(403)http响应,而不是CREATED(201)