我正在尝试将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
测试文档,但看不出我做错了什么。
答案 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方法在数据库中创建用户。这样,您就可以在其他情况下重复使用该用户test_POSTing_a_new_researcher
是一个非常奇怪的方法名称答案 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)