طرق الاختبار الثعبان أن أساليب الفئة دعوة
-
20-09-2019 - |
سؤال
ولدي طريقة بسيطة جدا:
Class Team(models.Model):
def sides(self):
return SideNames.objects.filter(team=self)
وSideNames هو نموذج آخر هو محدد في الملف نفسه كفريق،
ما عندما أحاول والاختبار:
self.assertEquals(len(t.sides()), 2)
وأحصل على الخطأ التالي:
<اقتباس فقرة>return SideNames.objects.filter(team=self)
وAttributeError: الكائن 'NoneType "لا يوجد لديه السمة' كائنات '
اقتباس فقرة>ولكن إذا قمت بتغيير اختبار ليكون
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)
المحلول
وقبل أي فرصة، هل الاختبار لا شيء من هذا القبيل:
from myapp import models
...
models.SideNames = None
ولأن هذا هو التفسير الوحيد الذي يمكنني أن أفكر لماذا SideNames يجب أن يكون بلا في سياق هذا الأسلوب.
وبوصفها جانبا، وطريقة في حد ذاته لا معنى لها، كما يتم توفير العلاقات الوراء تلقائيا من قبل جانغو، لذلك يمكن أن مجرد دعوة t.sidenames_set.all()
.
نصائح أخرى
في الوحدة النمطية التي تحدد الاختبار، كنت استيراد SideNames
اسم من بعض وحدة أخرى. في وحدة حيث يتم تعريف هذا الأسلوب sides
، لا يتم تعريف SideNames
اسم أو المستوردة.