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 の単体テストを記述する方法がわかりません。

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 に答える