Django 集成测试在应该失败时通过

Django Integrated Test Passing When it Should Fail

我正在使用 Django 创建评估系统;但是,我有一个通过的集成测试,我不确定为什么(它应该失败)。在测试中,我将bobenrollment对象的grade字段设置为"Excellent"。从下面的模型中可以看出,Enrollment 模型没有成绩字段(none 模型有)。我的印象是模型对象的点符号会访问模型字段(我对此可能不正确)。我不想编写无效的测试,所以我想知道是什么让这个测试通过,我应该怎么做才能让它失败。谢谢!

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

I was under the impression that dot notation of model objects would access the model fields (I'm probably incorrect about this)

你说得对。您没有考虑的事实是您可以动态地将属性添加到 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 属性,即使它未由 class 定义。这同样适用于代码中的以下行:

bobenrollment.grade = "Excellent"

Django 模型覆盖此行为,因此您可以无缝获取数据库值作为模型实例的属性,但该实例只是一个常规 python 对象。

如果你想测试 grade 属性 是否正确保存,你应该修改你的测试以在创建记录时添加 grade 的值并确保你的实例assert 反对是你从你的数据库中读取的那个(即不事先修改它)。