métodos pitón de pruebas que requieren métodos de clase
-
20-09-2019 - |
Pregunta
Tengo un método muy simple:
Class Team(models.Model):
def sides(self):
return SideNames.objects.filter(team=self)
SideNames es otro modelo definido en el mismo archivo como equipo,
¿Qué cuando intento y prueba:
self.assertEquals(len(t.sides()), 2)
Me sale el siguiente error:
return SideNames.objects.filter(team=self)
AttributeError: objeto 'NoneType' no tiene 'objetos' de atributo
pero si cambio de que la prueba sea
self.assertEquals(len(SideNames.objects.filter(team=t)), 2)
A continuación, no consigo el error. ¿Cuál es la diferencia entre llamar SideNames.objects.filter de la prueba en sí y llamar al método actual?
Como referencia, aquí están las 2 clases en su totalidad.
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)
Solución
Por casualidad, hace su prueba algo como esto:
from myapp import models
...
models.SideNames = None
ya que es la única explicación que se me ocurre por qué deberían ser SideNames Ninguno en el contexto de ese método.
Como acotación al margen, el método en sí no tiene sentido, ya que las relaciones hacia atrás se proporcionan automáticamente por Django, por lo que sólo podría llamar t.sidenames_set.all()
.
Otros consejos
En el módulo que define la prueba, que va a importar el nombre SideNames
de algún otro módulo. En el módulo donde se define que el método sides
, el nombre SideNames
no está definida o importada.