2016-07-18 7 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

내가 모델 필드에 액세스 할 모델 객체의 표기법을 도트 인상이었다 (내가 ' 아마도이 문제에 대해 아마도 부정확하다.)

이 문제가 맞습니다. 당신이 고려하지 않은 것은 파이썬 객체에 속성을 동적으로 추가 할 수 있다는 것입니다. 예를 들면 : 당신이 볼 수 있듯이

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" 

장고 모델이 동작을 재정의하지만, 인스턴스는 일반 파이썬 객체입니다 같은 코드에서 다음 줄에 적용됩니다.

당신이 grade 속성을 테스트하려면

가에 대해 인스턴스 당신에게 assert을 기록을 작성하고 확인하는 때 grade의 값을 추가 테스트를 수정해야 제대로 저장됩니다 당신이 당신의 DB에서 읽은 한 (즉,하지 미리 수정).

관련 문제