2012-07-21 62 views
0

models看起來像Django的:第一個測試通過,但在第二次測試加入

class PlaylistVideoManager(models.Manager): 
    def add_video_to_playlist(self, video, playlist): 
     """ 
     if video is already added to playlist, don't add it again 
     """ 
     search_video = self.get_video_for_playlist(playlist, video) 
     if search_video: 
      logging.info('video is already added to playlist, will not re-add - ' + repr(playlist) + ', ' + repr(video)) 
     else: 
      playlist_video = PlaylistVideo(video=video, playlist=playlist) 
      playlist_video.save() 
     return video 

    def get_all_videos_for_playlist(self, playlist): 
     videos_queryset = self.get_query_set().filter(playlist=playlist) 
     videos = [] 
     if videos_queryset: 
      for video in videos_queryset: 
       videos.append(video) 
     return videos 

    def get_video_for_playlist(self, playlist, video): 
     all_videos = self.get_all_videos_for_playlist(playlist) 
     if all_videos: 
      for vid in all_videos: 
       if vid.pk == video.pk: 
        return video  

class PlaylistVideo(models.Model): 
    playlist = models.ForeignKey(Playlist) 
    video = models.ForeignKey(Video) 
    objects = PlaylistVideoManager() 

    class Meta: 
     db_table = 'playlists_videos' 

和我first test看起來像

def test_add_same_video_twice_to_one_playlist(self): 
    """ 
    desired: same video added twice to one playlist should not add it twice in database 
    """ 
    video = Utility.create_video() 
    playlist = Utility.create_playlist() 
    PlaylistVideo.objects.add_video_to_playlist(video, playlist) 
    PlaylistVideo.objects.add_video_to_playlist(video, playlist) 
    self.assertEqual(PlaylistVideo.objects.count(), 1, msg='playlist video count is not 1, it is ' + str(PlaylistVideo.objects.count())) 
    self.assertEqual(len(PlaylistVideo.objects.get_all_videos_for_playlist(playlist)), 1, msg='videos count in playlist is not 1, it is ' + str(len(PlaylistVideo.objects.get_all_videos_for_playlist(playlist)))) 

當我運行這個測試,它運行良好失敗

Creating test database for alias 'default'... 
....INFO:root:adding video title - title, url - url 
INFO:root:video is already added to playlist, will not re-add - <Playlist id:7, name:playlist, date_created:2012-07-21 23:08:23.677941+00:00, deleted:False>, <Video id:1, title:title, url:url> 
.INFO:root:adding video title - title, url - url 

但是,只要我運行我的另一個測試,相同的測試失敗

def test_add_same_video_twice_to_different_playlist(self): 
    video = Utility.create_video() 
    playlist1 = Utility.create_playlist('playlist1') 
    playlist2 = Utility.create_playlist('playlist2') 
    PlaylistVideo.objects.add_video_to_playlist(video, playlist1) 
    PlaylistVideo.objects.add_video_to_playlist(video, playlist2) 
    self.assertEqual(PlaylistVideo.objects.count(), 2, msg='playlist video count is not 2, it is ' + str(PlaylistVideo.objects.count())) 
    self.assertEqual(len(PlaylistVideo.objects.get_all_videos_for_playlist(playlist1)), 1, msg='videos count in playlist1 is not 1, it is ' + str(len(PlaylistVideo.objects.get_all_videos_for_playlist(playlist1)))) 
    self.assertEqual(len(PlaylistVideo.objects.get_all_videos_for_playlist(playlist2)), 1, msg='videos count in playlist2 is not 1, it is ' + str(len(PlaylistVideo.objects.get_all_videos_for_playlist(playlist2)))) 


====================================================================== 
FAIL: test_add_same_video_twice_to_one_playlist (App.apps.playlists.tests.PlaylistVideoTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/hhimanshu/code/p/Apps/App/apps/playlists/tests.py", line 96, in test_add_same_video_twice_to_one_playlist 
    self.assertEqual(PlaylistVideo.objects.count(), 1, msg='playlist video count is not 1, it is ' + str(PlaylistVideo.objects.count())) 
AssertionError: playlist video count is not 1, it is 2 

---------------------------------------------------------------------- 
Ran 10 tests in 1.315s 

FAILED (failures=1) 
Destroying test database for alias 'default'... 

Utility類是什麼樣子

PLAYLIST = 'playlist' 
class Utility(): 
    @staticmethod 
    def create_playlist(playlist_name=PLAYLIST): 
     return Playlist.objects.add_playlist(playlist_name) 

    @staticmethod 
    def create_user(name='test', email='test', passwd='test'): 
     return User.objects.create_user(name, email, passwd) 

    @staticmethod 
    def create_video(title='title', url='url'): 
     return Video.objects.get_or_create_video(title, url) 
  • 應該不會錯什麼嗎?它的代碼相同?
  • 是我應該在每次測試後重置我的數據庫嗎?我怎樣才能做到這一點?
+0

「Playlist.objects.add_playlist」在哪裏定義?在PlaylistVideoManager中看不到'add_playlist' – Hamish 2012-07-21 23:25:17

回答

2

的問題是,在測試數據庫而不是每個測試

後重新閱讀Django的測試和SO後,我意識到,我需要TransactionTestCase

相關鏈接
Django Doc
SO question

做完這些之後,我所有的測試都很開心:)

Creating test database for alias 'default'... 
....INFO:root:adding video title - title, url - url1 
.INFO:root:adding video title - title, url - myurl 
INFO:root:video is already added to playlist, will not re-add - <Playlist id:1, name:playlist, date_created:2012-07-21 23:25:15.411728+00:00, deleted:False>, <Video id:1, title:title, url:myurl> 
.INFO:root:adding video title - title, url - url 
.INFO:root:playlist created: <Playlist id:1, name:playlist, date_created:2012-07-21 23:25:15.904582+00:00, deleted:False>, <User: test> 
INFO:root:playlist created: <Playlist id:2, name:playlist1, date_created:2012-07-21 23:25:15.912512+00:00, deleted:False>, <User: test> 
.INFO:root:playlist created: <Playlist id:1, name:playlist, date_created:2012-07-21 23:25:16.230842+00:00, deleted:False>, <User: test> 
INFO:root:Playlist already exists: <Playlist id:1, name:playlist, date_created:2012-07-21 23:25:16.230842+00:00, deleted:False>, <User: test> 
.INFO:root:playlist created: <Playlist id:1, name:playlist, date_created:2012-07-21 23:25:16.861322+00:00, deleted:False>, <User: user1> 
INFO:root:playlist created: <Playlist id:2, name:playlist, date_created:2012-07-21 23:25:16.866924+00:00, deleted:False>, <User: user2> 
. 
---------------------------------------------------------------------- 
Ran 10 tests in 2.427s 

OK 
Destroying test database for alias 'default'... 
+0

(順便說一下,爲什麼不接受你自己的答案 - 對於家務管理,這樣它就不會在StackOverflow上顯示爲未答覆。=)) – Tony 2013-04-21 05:11:31

+1

就是這麼做的! – daydreamer 2013-04-21 05:21:57

相關問題