2010-02-13 5 views
-1

у меня есть очень простой метод:методы тестирования питона, которые называют методы класса

Class Team(models.Model): 
    def sides(self): 
     return SideNames.objects.filter(team=self) 

SideNames другая модель определяется в том же файле, команда,

Который, когда я пробую и тест:

self.assertEquals(len(t.sides()), 2) 

я получаю следующее сообщение об ошибке:

return SideNames.objects.filter(team=self) 

AttributeError: 'NoneType' object has no attribute 'objects'

, но если я изменяю тест, чтобы быть

self.assertEquals(len(SideNames.objects.filter(team=t)), 2) 

Тогда я не получаю сообщение об ошибке. В чем разница между вызовом SideNames.objects.filter из самого теста и вызовом фактического метода?

Для справки, здесь представлены 2 класса.

class Team(models.Model): 
    """The model for a football team.""" 

    class Admin: 
      pass 

    def __unicode__(self): 
      return u'%s' % self.name 

    def is_player(self, player): 
      """Checks to see if 'player' is a member if this team. Returns True if they are, or False otherwise.""" 

      try: 
        teamPlayer = TeamPlayers.objects.get(player=player, team=self) 
        return True 
      except ObjectDoesNotExist: 
        return False 

    def sides(self): 
      """Return the side names for this team""" 
      return SideNames.objects.filter(team=self) 

    def updateSides(self, side_a, side_b): 
      """Update the side names""" 
      names = SideNames.objects.filter(team=self); 

      a = SideNames.objects.get(name = names[0].name) 
      a.name = side_a 
      a.save() 

      b = SideNames.objects.get(name = names[1].name) 
      b.name = side_b 
      b.save() 

    name = models.CharField("Team Name", max_length=255) 
    organiser = models.ForeignKey(User) 

class SideNames(models.Model): 
    """Holds the names of the sides for each team""" 

    class Admin: 
      pass 

    def __unicode__(self): 
      """Pretty print the SideNames object""" 
      return self.name 

    team = models.ForeignKey(Team) 
    name = models.CharField(max_length=128) 
+0

'стороны' - это метод, а не метод класса. –

ответ

1

Случайно ли ваш тест сделать что-то вроде этого:

from myapp import models 

... 

models.SideNames = None 

, так что это единственное объяснение, которое я могу думать, почему SideNames не должно быть ни в контексте этого метода.

Как в стороне, сам метод бессмыслен, так как обратные отношения автоматически предоставляются Django, поэтому вы можете просто позвонить t.sidenames_set.all().

+0

Спасибо, Дэниэл, я определенно не устанавливаю SideNames в None, но я внедрил ваше предложение о sidenames_set, и это было трюком. –

1

В модуле, который определяет тест, вы импортируете имя SideNames из другого модуля. В модуле, где указан метод sides, имя SideNames не определено или не импортировано.

+0

SideNames определяется в том же файле, что и метод, который его использует. –

+0

@Stuart Grimshaw, согласно Python, 'SideNames' является None, когда вы вызываете' t.sides() '. Возможно, вам следует опубликовать весь файл, в котором он встречается, и тест, который вызывает непредвиденную ошибку. –

+1

@Johnathan Feinberg, Обратите внимание, что это не было 'NameError'. Проблема заключается не в имени, а в том, что он ссылается на «Нет». –

Смежные вопросы