【问题标题】:Testing python methods that call class methods测试调用类方法的python方法
【发布时间】:2010-02-13 00:57:59
【问题描述】:

我有一个很简单的方法:

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 和调用实际方法有什么区别?

作为参考,这里是 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)

【问题讨论】:

  • sides 是一种方法,而不是类方法。

标签: python unit-testing python-unittest


【解决方案1】:

你的测试是否会做这样的事情:

from myapp import models

...

models.SideNames = None

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

顺便说一句,该方法本身毫无意义,因为向后关系是由 Django 自动提供的,所以你可以调用t.sidenames_set.all()

【讨论】:

  • 感谢 Daniel,我绝对不会将 SideNames 设置为 None,但我已经实施了您关于 sidenames_set 的建议,并且成功了。
【解决方案2】:

在定义测试的模块中,您从其他模块导入名称SideNames。在定义了 sides 方法的模块中,名称 SideNames 没有定义或导入。

【讨论】:

  • SideNames 与使用它的方法在同一个文件中定义。
  • @Stuart Grimshaw,根据 Python,当您调用 t.sides() 时,SideNames 为 None。也许您应该发布它发生的整个文件以及触发意外错误的测试。
  • @Johnathan Feinberg,注意这不是NameError。问题不在于名称,而在于它引用了None
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2017-12-28
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多