2016-07-18 3 views
0

Я в процессе создания системы оценки с использованием Django; однако у меня есть интегрированный тест, который проходит, и я не уверен, почему (он должен быть неудачным). В тесте я установил поле оценки объекта bobenrollment на «Отлично». Как видно из приведенных ниже моделей, модель регистрации не имеет поля оценки (ни одна из моделей не делает). У меня создалось впечатление, что точечные обозначения объектов модели будут обращаться к полям модели (возможно, я ошибаюсь в этом). Я не хочу писать неэффективные тесты, поэтому я хотел бы знать, что делает этот тест пройденным и что я должен сделать, чтобы он сломался. Благодаря!Django Integrated Pass Passing, когда он должен завершиться

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

Я был под впечатлением, что точка обозначения объектов модели будет доступ к модели поля (I» m, вероятно, неверно об этом)

Вы правы. То, что вы не принимаете во внимание, - это тот факт, что вы можете динамически добавлять свойства к объектам 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 имущество, даже если оно не определяется классом. То же самое относится и к следующей строке в коде:

bobenrollment.grade = "Excellent" 

модель Django переопределить это поведение, так что вы можете легко получить значение БД в качестве свойств экземпляра модели, но экземпляр просто обычный объект питона.

Если вы хотите, чтобы проверить grade свойства сохранялся правильно, вы должны изменить свой тест, чтобы добавить значение grade при создании записи и убедившись, что экземпляр, который вы assert против это один вы читаете из вашей БД (т.е. не предварительно модифицируя его).

 Смежные вопросы

  • Нет связанных вопросов^_^