2016-07-18 10 views
0

Ich bin dabei, ein Bewertungssystem mit Django zu erstellen; Ich habe jedoch einen integrierten Test, der bestanden hat, und ich bin mir nicht sicher, warum (es sollte scheitern). Im Test habe ich das Notenfeld des boberrollment-Objekts auf "Excellent" gesetzt. Wie Sie den folgenden Modellen entnehmen können, verfügt das Registrierungsmodell über kein Notenfeld (keines der Modelle). Ich hatte den Eindruck, dass die Punktnotation von Modellobjekten auf die Modellfelder zugreifen würde (dazu bin ich wahrscheinlich nicht korrekt). Ich möchte keine unwirksamen Tests schreiben, also würde ich gerne wissen, was diesen Test passieren lässt und was ich tun muss, um ihn zu brechen. Vielen Dank!Django Integrierter Test bestanden, wenn er fehlschlagen sollte

class ClassAndSemesterModelTest(TestCase): 

    def add_two_classes_to_semester_add_two_students_to_class(self): 
     first_semester = Semester.objects.create(text='201530') 
     edClass = EdClasses.objects.create(name='EG 5000') 
     edClass2 = EdClasses.objects.create(name='EG 6000') 

     first_semester.classes.add(edClass) 
     first_semester.classes.add(edClass2) 

     bob = Student.objects.create(name="Bob DaBuilder") 
     jane = Student.objects.create(name="Jane Doe") 

     bobenrollment = Enrollment.objects.create(student=bob, edclass=edClass) 
     janeenrollment = Enrollment.objects.create(student=jane,edclass=edClass) 
     bobenrollment2 = Enrollment.objects.create(student=bob,edclass=edClass2) 
     janeenrollment2 = Enrollment.objects.create(student=jane,edclass=edClass2) 

    def test_students_link_to_enrollments(self): 
     self.add_two_classes_to_semester_add_two_students_to_class() 
     edclass1 = EdClasses.objects.get(name="EG 5000") 
     bob = Student.objects.get(name="Bob DaBuilder") 
     #The three lines below are the subject of my question 
     bobenrollment = Enrollment.objects.get(edclass=edclass1, student=bob) 
     bobenrollment.grade = "Excellent" 
     self.assertEqual(bobenrollment.grade, "Excellent") 

Und die Modelle unter:

from django.db import models 

class Student(models.Model): 
    name = models.TextField(default="") 

    def __str__(self): 
     return self.name 
    #TODO add models 

class EdClasses(models.Model): 
    name = models.TextField(default='') 
    students = models.ManyToManyField(Student, through="Enrollment") 

    def __str__(self): 
     return self.name 

class Semester(models.Model): 
    text = models.TextField(default='201530') 
    classes = models.ManyToManyField(EdClasses) 
    def __str__(self): 
     return self.text 

class Enrollment(models.Model): 
    student = models.ForeignKey(Student) 
    edclass = models.ForeignKey(EdClasses) 

Requirements.txt

beautifulsoup4==4.4.1 
Django==1.5.4 
ipython==3.1.0 
LiveWires==2.0 
nose==1.3.3 
Pillow==2.7.0 
projectname==0.1 
pyperclip==1.5.11 
pytz==2015.2 
requests==2.10.0 
selenium==2.53.6 
six==1.9.0 
South==1.0.2 
swampy==2.1.7 
virtualenv==1.11.5 

Antwort

0

Ich hatte den Eindruck, dass Notation von Modellobjekten dot würde die Modellfelder zugreifen (I‘ M wahrscheinlich falsch darüber)

Sie haben Recht damit. Was Sie nicht berücksichtigen, ist die Tatsache, dass Sie Python-Objekten dynamisch Eigenschaften hinzufügen können. Zum Beispiel:

In [1]: class MyClass(): 
    ...:  pass 
    ...: 
In [2]: a = MyClass() 
In [3]: a.im_a_property = 'hello' 
In [4]: print a.im_a_property 
hello 

Wie Sie sehen können, hat die a Instanz die im_a_propery Eigenschaft, obwohl sie nicht von der Klasse definiert wird. Das gleiche gilt für die folgende Zeile im Code:

bobenrollment.grade = "Excellent" 

Django Modelle dieses Verhalten außer Kraft setzen, so dass Sie nahtlos DB Wert als Eigenschaften des Modell Instanz bekommen, aber die Instanz ist nur ein ganz normales Python-Objekt.

Wenn Sie die grade Eigenschaft testen möchten, wird korrekt gespeichert, sollten Sie Ihren Test ändern Sie den Wert von grade bei der Erstellung des Datensatzes und sicherstellen, dass die Instanz, die Sie assert gegen ist, die Sie von Ihrem DB lesen hinzuzufügen (dh nicht es vorher modifizieren).