2010-02-13 72 views
-1

我有一個非常簡單的方法:測試Python方法調用類的方法

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

'sides'是一種方法,不是類方法。 – 2010-02-13 01:08:48

回答

1

以任何機會,並測試做這樣的事情:

from myapp import models 

... 

models.SideNames = None 

,因爲這是我能想到的,爲什麼SideNames應無該方法的上下文中的唯一解釋。

另外,該方法本身是沒有意義的,因爲向後關係是由Django自動提供的,因此您可以撥打t.sidenames_set.all()

+0

感謝Daniel,我絕對沒有將SideNames設置爲None,但是我已經實施了關於sidenames_set的建議,而這已經完成了。 – 2010-02-13 13:46:59

1

在定義測試的模塊,你從其他模塊導入名SideNames。在定義sides方法的模塊中,名稱SideNames未定義或導入。

+0

SideNames在與使用它的方法相同的文件中定義。 – 2010-02-13 01:08:07

+0

@Stuart Grimshaw,根據Python的說法,當你調用't.sides()'時,'SideNames'是None。也許你應該發佈它發生的整個文件以及觸發意外錯誤的測試。 – 2010-02-13 01:16:22

+1

@Johnathan Feinberg,請注意,這不是'NameError'。問題不在於名稱,而在於它引用「無」的事實。 – 2010-02-13 01:17:48

相關問題