2016-07-18 17 views
0

私はDjangoを使用して評価システムを作成しています。しかし、私は合格したテストを持っていますが、私はなぜ(それが失敗しているはずですか)確信が持てません。テストでは、bobenrollmentオブジェクトのグレードフィールドを "Excellent"に設定しました。下のモデルからわかるように、登録モデルにはグレードフィールドはありません(モデルのどれも)。私はモデルオブジェクトのドット表記法がモデルフィールドにアクセスするという印象を受けました(私はおそらくこれについて間違っています)。私は効果のないテストを書いて欲しくないので、このテストが何を通過するのか、それを壊すために何をすべきかを知りたい。ありがとう!Django統合テストで合格が失敗した場合

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") 

とモデル以下:

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 

答えて

0

私はモデルフィールドにアクセスするモデルオブジェクトの表記をドット印象の下にあった(私は」これについてはおそらく間違っています)

これは間違いありません。あなたが考慮していないのは、あなたが動的にプロパティをPythonオブジェクトに追加できるという事実です。例えば:あなたが見ることができるように

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

aインスタンスは、それがクラスで定義されていないにもかかわらず、im_a_propery性質を持つことになります。同じことが、あなたのコードに次の行に適用されます。あなたがシームレスにあなたのモデルインスタンスのプロパティとしてDB値を得ることができるので、

bobenrollment.grade = "Excellent" 

Djangoのモデルは、この動作をオーバーライドするが、インスタンスは通常のPythonオブジェクトです。

あなたはgradeプロパティが正しく保存されますテストしたい場合は、レコードを作成するときにgradeの値を追加するために、あなたのテストを変更する必要がありますし、必ずインスタンスを作るあなたはassertに対しては、あなたのDBから読み出された1である(すなわちありませんあらかじめ変更する)。

関連する問題