gpt4 book ai didi

python - 如何在 Django 中为带有 ListField 变量的方法编写单元测试?

转载 作者:行者123 更新时间:2023-11-28 20:56:25 25 4
gpt4 key购买 nike

我以前从未写过单元测试。我正在尝试为此类编写单元测试:

class User(models.Model):
facebook_id = models.CharField(max_length=200)
friends = ListField()
status = models.CharField(max_length=200)
status_time = models.DateTimeField('date published')

@staticmethod
def login(cls, userid, facebook_friends):
myuser = None
try:
myuser = User.objects.get(facebook_id=userid)
except User.DoesNotExist:
myuser = User()
myuser.status_time = datetime.datetime.now() - datetime.timedelta(minutes=16)
myuser.facebook_id = userid
myuser.save()

# user exists
myuser.friends = facebook_friends
myuser.save()
return {"data":myuser.get_friend_statuses()}

但我不确定如何为 facebook_friend 编写单元测试,因为它在 List Field 类中:

class ListField(models.TextField):
__metaclass__ = models.SubfieldBase
description = "Stores a python list"

def __init__(self, *args, **kwargs):
super(ListField, self).__init__(*args, **kwargs)

def to_python(self, value):
if not value:
value = []
if isinstance(value, list):
return value
return ast.literal_eval(value)

def get_prep_value(self, value):
if value is None:
return value
return unicode(value)

def value_to_string(self, obj):
value = self._get_val_from_obj(obj)
return self.get_db_prep_value(value)

我试过这样的东西,但它不起作用,我不确定如何写:

 class ListField(models.TextField):
def test_wrong_username(self):
user = User.login(self, 'username1', ['one', 'two', 'three'])
errcode = User.login(self, 'username2', ['one', 'two', 'three'])
self.assertEqual(errcode, user)

谁能帮我/告诉我如何为此编写单元测试?

最佳答案

我假设您实际上想要测试登录方法,而不是测试 facebook_friends。我假设这是因为这就是您的示例测试代码告诉我的内容。

好的,所以您希望登录方法的行为是

如果具有给定 userid 的用户存在,则从数据库中检索它。我们传递给函数的 facebook_friends 被保存到 friends 属性中,我们返回一个包含 friend 状态的字典。

如果用户不存在,我们创建它,设置几个属性,保存它,然后按照与上面相同的代码路径的其余部分。所以,我的用户单元测试存在登录方法的代码路径可能看起来像这样

import unittest
from mock import patch

class UserLoginTest(unittest.TestCase):

@patch('model.User.get_friend_statuses')
def test_login_when_user_exists(self, mock_get_friend_statuses):
# objects.create creates and saves a db entry in one step
User.objects.create(facebook_id='an_id')

return_value = User.login('an_id', ['some', 'list', 'items'])

user = User.objects.get(facebook_id='an_id')
self.assertEqual(user.friends, ['some', 'list', 'items'])
self.assertEqual(
return_value,
{'data' mock_get_friend_statuses.return_value}
)
self.assertIsNone(user.status_time)

关于python - 如何在 Django 中为带有 ListField 变量的方法编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15630385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com