代码之家  ›  专栏  ›  技术社区  ›  Stuart Grimshaw

测试调用类方法的python方法

  •  -1
  • Stuart Grimshaw  · 技术社区  · 16 年前

    我有一个非常简单的方法:

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

    sidenames是与team在同一个文件中定义的另一个模型,

    当我试着测试的时候:

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

    我得到以下错误:

    return SideNames.objects.filter(team=self)
    

    attributeError:“nonetype”对象没有属性“objects”

    但是如果我把测试改成

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

    那我就不会出错了。从测试本身调用sidenames.objects.filter和调用实际方法有什么区别?

    以下是两个类的整体,供参考。

    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)
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Daniel Roseman    16 年前

    不管怎样,你的测试是这样做的吗?

    from myapp import models
    
    ...
    
    models.SideNames = None
    

    因为这是我能想到的唯一解释,为什么在这个方法的上下文中,侧名应该是非。

    作为旁白,方法本身是无意义的,因为django自动提供向后关系,所以您可以调用 t.sidenames_set.all() .

        2
  •  1
  •   Jonathan Feinberg    16 年前

    在定义测试的模块中,您正在导入名称 SideNames 来自其他模块。在模块中, sides 方法已定义,名称 旁侧符号 未定义或导入。