Testen Python Methoden dieser Aufruf von Klassenmethoden
-
20-09-2019 - |
Frage
Ich habe eine sehr einfache Methode:
Class Team(models.Model):
def sides(self):
return SideNames.objects.filter(team=self)
SideNames ist ein weiteres Modell in der gleichen Datei als Team definiert,
Was, wenn ich versuche und Test:
self.assertEquals(len(t.sides()), 2)
ich die folgende Fehlermeldung erhalten:
return SideNames.objects.filter(team=self)
Attribute: 'NoneType' Objekt hat kein Attribut 'Objekte'
aber wenn ich den Test ändern sein
self.assertEquals(len(SideNames.objects.filter(team=t)), 2)
Dann bekomme ich den Fehler nicht. Was ist der Unterschied zwischen SideNames.objects.filter vom Test selbst aufrufen und die aktuelle Methode aufrufen?
Als Referenz, hier sind die zwei Klassen in ihrer Gesamtheit.
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)
Lösung
Durch eine Chance, tut Ihr Test etwas tun, wie folgt aus:
from myapp import models
...
models.SideNames = None
denn das ist die einzige Erklärung, die ich von denken kann, warum SideNames keine im Rahmen dieses Verfahrens sein sollte.
Als Nebenwirkung, die Methode selbst ist sinnlos, wie rückwärts Beziehungen automatisch von Django zur Verfügung gestellt werden, so dass Sie nur t.sidenames_set.all()
nennen könnten.
Andere Tipps
In dem Modul, das den Test definiert, importieren Sie den Namen SideNames
von einem anderen Modul. In dem Modul, in dem die sides
Methode definiert ist, wird der Name SideNames
nicht definiert oder importiert werden.