我以前从未写过单元测试。我正在尝试为这个班写单元测试:
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)
任何人都可以帮助我/告诉我如何编写这个单元测试吗?
答案 0 :(得分:0)
我将假设您不是测试facebook_friends
而是实际上想要测试登录方法。我假设这是因为这是你的示例测试代码告诉我的。
好的,所以你想从登录方法中获得的行为是
如果存在具有给定用户标识的用户,则从数据库中检索该用户标识。我们传递给函数的facebook_friends被保存到friends属性中,我们返回一个带有朋友状态的字典。
如果用户不存在,我们创建它,设置几个属性,保存它,然后遵循上面相同代码路径的其余部分。因此,我对用户的单元测试存在登录方法的代码路径可能看起来像这样
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)