méthodes de python de test qui appellent des méthodes de classe
-
20-09-2019 - |
Question
J'ai une méthode très simple:
Class Team(models.Model):
def sides(self):
return SideNames.objects.filter(team=self)
SideNames est un autre modèle défini dans le même fichier que l'équipe,
Quel quand je tente de test:
self.assertEquals(len(t.sides()), 2)
Je reçois l'erreur suivante:
return SideNames.objects.filter(team=self)
AttributeError: 'objets' objet 'NoneType' n'a pas d'attribut
mais si je change le test pour être
self.assertEquals(len(SideNames.objects.filter(team=t)), 2)
Alors je ne comprends pas l'erreur. Quelle est la différence entre l'appel SideNames.objects.filter de l'essai lui-même et appeler la méthode réelle?
Pour référence, voici les 2 classes dans leur intégralité.
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)
La solution
Par hasard, votre test de faire quelque chose comme ceci:
from myapp import models
...
models.SideNames = None
puisque c'est la seule explication que je peux penser pourquoi SideNames devrait être aucun dans le contexte de cette méthode.
En aparté, la méthode elle-même est inutile, car les relations arrière sont fournis automatiquement par Django, de sorte que vous pouvez simplement appeler t.sidenames_set.all()
.
Autres conseils
Dans le module qui définit le test, vous importez le nom SideNames
d'un autre module. Dans le module lorsque cette méthode sides
est définie, le nom SideNames
est pas défini ou importé.