如何使用ListField变量在Django中编写unittest?

时间:2013-03-26 06:03:12

标签: python django unit-testing testing

我以前从未写过单元测试。我正在尝试为这个班写单元测试:

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)

任何人都可以帮助我/告诉我如何编写这个单元测试吗?

1 个答案:

答案 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)