我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)
- 應該不會錯什麼嗎?它的代碼相同?
- 是我應該在每次測試後重置我的數據庫嗎?我怎樣才能做到這一點?
「Playlist.objects.add_playlist」在哪裏定義?在PlaylistVideoManager中看不到'add_playlist' – Hamish 2012-07-21 23:25:17