在使用 Django Rest Framework (DRF) 进行单元测试时,遇到 ValueError: Cannot assign "u'johnz'": "Message.author" must be a "User" instance
错误,通常是因为在测试中尝试将一个字符串赋值给 Message.author
字段,而该字段期望的是一个 User
实例。
CharField
, ForeignKey
等。错误信息表明 Message.author
字段期望的是一个 User
实例,而你尝试赋值的是一个字符串。这通常发生在以下情况:
author
字段。User
实例。User
实例在测试中,首先创建一个 User
实例,然后将其赋值给 Message.author
字段。
from django.contrib.auth.models import User
from rest_framework.test import APITestCase
from myapp.models import Message
class MessageTestCase(APITestCase):
def setUp(self):
self.user = User.objects.create(username='johnz')
self.message = Message.objects.create(author=self.user, content='Hello World')
def test_message_author(self):
self.assertEqual(self.message.author, self.user)
force_text
或 force_str
如果你必须使用字符串,可以使用 Django 提供的 force_text
或 force_str
函数将其转换为 User
实例。
from django.utils.encoding import force_str
from rest_framework.test import APITestCase
from myapp.models import Message
class MessageTestCase(APITestCase):
def setUp(self):
self.user = User.objects.create(username='johnz')
self.message = Message.objects.create(author=force_str(self.user), content='Hello World')
def test_message_author(self):
self.assertEqual(self.message.author, self.user)
以下是一个完整的示例,展示了如何在测试中正确创建和使用 User
实例。
from django.contrib.auth.models import User
from rest_framework.test import APITestCase
from myapp.models import Message
class MessageTestCase(APITestCase):
def setUp(self):
self.user = User.objects.create(username='johnz')
self.message = Message.objects.create(author=self.user, content='Hello World')
def test_message_author(self):
self.assertEqual(self.message.author, self.user)
通过这种方式,可以确保 Message.author
字段始终接收一个有效的 User
实例,从而避免 ValueError
错误。
领取专属 10元无门槛券
手把手带您无忧上云