2012-06-15 4 views
1

안녕 내 django 웹 응용 프로그램에 대한 일부 unittests 작성하려고하지만 일부 데이터베이스 문제가 내 테스트를 실행할려고 해요. 테스트를 위해 인스턴스를 생성하기 위해 일부 공장에서 Factory Boy를 사용하고 있습니다 (https://github.com/dnerdy/factory_boy는 repo 임).하지만 테스트를 실행할 때 몇 가지 문제가 있습니다. 나는 다음과 같은 데이터베이스 오류가 발생한다. ./manage.py syncdb를 실행하려고하면 테스트와 테이블을 실행하려고 할 때 해당 열이 없다는 오류가 발생한다 (실제 오류가 아래에 포함될 것이다). 테스트를 위해 기본 sqlite3 데이터베이스 설정을 사용하고 있으므로 테스트 DB를 작성한 후 테스트가 자동으로 삭제됩니다. 여기 django/sqllite3는 테스트 용 데이터베이스를 어떻게 구축합니까?

다음은 오류를 던지고 모델 내 settings.py 파일

if 'test' in sys.argv or 'jenkins' in sys.argv: 
DATABASES = { 
      'default': { 
         'ENGINE': 'django.db.backends.sqlite3', 
         'NAME': 'test_ndptc' 
         } 
      } 

의 관련 부분이다.

class CourseManager(models.Manager): 
def get_query_set(self): 
    return super(CourseManager, self).get_query_set().order_by('CourseName') 

class Course(models.Model): 
""" 
""" 
CourseName = models.CharField(max_length=80) 
ShortName = models.CharField(max_length=50) 
CourseNumber = models.CharField(max_length=50) 
TrainingProvider = models.ForeignKey(TrainingProvider) 
TrainingType = models.ForeignKey(TrainingType) 
CourseType = models.ForeignKey(CourseType) 
ModuleCount = models.IntegerField() 
ContactHours = models.CharField(max_length=5) 
Certified = models.BooleanField() 
Description = models.TextField(null=True, blank=True) 
TargetAudience = models.TextField(null=True, blank=True) 
Prerequisites = models.TextField(null=True, blank=True) 
Requirements = models.TextField(null=True, blank=True) 
Icon2d = models.FileField(upload_to='icons/', null=True, blank=True) 
Icon3d = models.FileField(upload_to='icons/', null=True, blank=True) 
Status = models.IntegerField(null=True) 
UpdateUser = models.ForeignKey(User, null=True) 
UpdateDate = models.DateField(null=True) 
Featured = models.BooleanField(verbose_name='is featured?') 

objects = CourseManager() 

다음은 오류가 발생한 공장입니다. 마침내 여기

class TestFactory(factory.Factory): 
FACTORY_FOR = Test 

Course = random.choice(Course.objects.all()) 
EffectiveDate = '01/01/2012' 
Type = random.choice(TestType.objects.all()) 
Label = 'test_label' 
Status = 1 
UpdateUser = factory.LazyAttribute(lambda a: UserFactory()) 
UpdateDate = '01/01/2012' 

그리고

내가 그 random.choice가 빈리스트에서 실행되는 생각 ./manage.py 테스트를

Traceback (most recent call last): 
File "./manage.py", line 11, in <module> 
execute_manager(settings) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1- py2.7.egg/django/core/management/__init__.py", line 438, in execute_manager 
utility.execute() 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/core/management/__init__.py", line 379, in execute 
self.fetch_command(subcommand).run_from_argv(self.argv) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/core/management/base.py", line 191, in run_from_argv 
self.execute(*args, **options.__dict__) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/core/management/base.py", line 220, in execute 
output = self.handle(*args, **options) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/core/management/commands/test.py", line 37, in handle 
failures = test_runner.run_tests(test_labels) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/test/simple.py", line 358, in run_tests 
suite = self.build_suite(test_labels, extra_tests) 
File "/home/brandon/course-management/Testing/runner.py", line 17, in build_suite 
suite = unittest.defaultTestLoader.loadTestsFromNames(test_labels) 
File "/usr/lib/python2.7/unittest/loader.py", line 128, in loadTestsFromNames 
suites = [self.loadTestsFromName(name, module) for name in names] 
File "/usr/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName 
module = __import__('.'.join(parts_copy)) 
File "/home/brandon/course-management/Testing/admin_tests.py", line 5, in <module> 
from Testing.Factories.course_factory import * 
File "/home/brandon/course-management/Testing/Factories/course_factory.py", line 19, in <module> 
class TestFactory(factory.Factory): 
File "/home/brandon/course-management/Testing/Factories/course_factory.py", line 22, in TestFactory 
Course = random.choice(Course.objects.all()) 
File "/usr/lib/python2.7/random.py", line 274, in choice 
return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/db/models/query.py", line 82, in __len__ 
self._result_cache = list(self.iterator()) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/db/models/query.py", line 273, in iterator 
for row in compiler.results_iter(): 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/db/models/sql/compiler.py", line 680, in results_iter 
for rows in self.execute_sql(MULTI): 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/db/models/sql/compiler.py", line 735, in execute_sql 
cursor.execute(sql, params) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/db/backends/sqlite3/base.py", line 234, in execute 
return Database.Cursor.execute(self, query, params) 
django.db.utils.DatabaseError: no such column: Course_course.ShortName 

답변

1

을 실행할 때 발생하는 오류입니다. 게으른 속성을 사용할 수 있다고 생각합니다.

@factory.lazy_attribute 
def course(a): 
    """ Creates a course if none exist 
    """ 
    if Course.objects.count() == 0: 
     course = CourseFactory() 
     return course 
    else: 
     return random.choice(Course.objects.all())