@api_view(["POST"])
def register_view(request: "Request"):
serializer = RegisterSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
serializer.save()
except IntegrityError:
raise ConflictException
return Response(serializer.data, status=status.HTTP_201_CREATED)
class ConflictException(APIException):
status_code = 409
default_detail = "username is already taken"
default_code = "conflict"
def test_username_taken(self):
with transaction.atomic():
User.objects.create_user(username="customer4", password="Passw0rd!")
response = self.client.post(
"/register",
{
"username": "customer4",
"password": "Passw0rd!",
"confirm_password": "Passw0rd!",
"phone_number": "13324252666"
},
)
self.assertEqual(response.status_code, status.HTTP_409_CONFLICT)
测试结果显示:
引发事务管理错误( django.db.transaction.TransactionManagementError:当前事务中发生错误。在“原子”块结束之前您无法执行查询。
我是 Django 和 DRF 菜鸟,不知道该怎么办...
我在postman上测试没有问题,有409 status_code响应
409 状态代码用于指示与资源的当前状态发生冲突,例如在尝试创建或更新已存在或具有冲突信息的资源时。
我认为它已经存在。
所以我希望你暂时不要使用原子事务
并且 serilizer.save 不是 atmoic。
你可以像这样设置你的测试。
类 RegisterViewTests(APITestCase): def 设置(自身): self.client = APIClient() User.objects.create_user(用户名=“customer4”,密码=“Passw0rd!”)
def test_username_taken(self):
response = self.client.post(
"/register",
{
"username": "customer4",
"password": "Passw0rd!",
"confirm_password": "Passw0rd!",
"phone_number": "13324252666"
},
)
self.assertEqual(response.status_code, status.HTTP_409_CONFLICT)