1

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

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)

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

4

1 回答 1

0

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

好的,所以您希望从登录方法中获得的行为是

如果具有给定用户 ID 的用户存在,则从数据库中检索该用户。我们传递给函数的 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) 
于 2013-03-26T08:46:23.667 回答