2010-03-24 2 views
1

이제 기존 코드에 대한 단위 테스트를하고 있습니다. 내가 다음 문제에 직면 : 테스트 데이터베이스를 만드는 syncdb를 실행 한 후여러 의존적 애플리케이션 문제로 장고를 로딩하는 Django 유닛 테스트

을, 장고가 자동으로 django_content_type 또는 auth_permissions 같은 여러 테이블을 채 웁니다.

그런 다음, 나는 복잡한 테스트를 실행해야 상상처럼 그들 사이에 LOF 하다며 데이터 테이블과 연결이 필요합니다 사용자 등록을 확인합니다.

만약 내가 기존의 모든 데이터베이스를 사용하여 조명기를 만들려고한다면 (나는 그다지 편리 할 것이다) - here과 같은 오류 메시지가 나타날 것이다. 이것은 장고가 이미 django_content_type과 같은 테이블을 채웠기 때문에 발생합니다.

다음으로 가능한 방법은 syncdb 테이블로 채워진 django dumpdata --exclude 옵션을 사용하는 것입니다. 그러나 이것도 잘 작동하지 않습니다. 왜냐하면 db와 User Permissions 테이블에서 UserDB와 User Permissions 테이블을 가져 와서 syncdb에 의해 자동 생성 되었기 때문에, 그것들을 연결하는 기본 키가 이제 잘못 가리 키기 때문에 에러를받을 수 있기 때문입니다. 이것은 더 나은 '고정 지옥'부분에 here 설명하지만,이 솔루션은

내가 볼 다음 가능한 제도가 옆에) 잘 보이지 doensn't가 도시되어있다 :

  1. 내가 내 테스트를 실행하는거야; Django는 테스트 데이터베이스를 만들고 syncdb를 만들고 모든 테이블을 만듭니다.
  2. 내 테스트 환경에서이 데이터베이스를 삭제하고 새로운 빈 데이터베이스를 만듭니다. syncdb 테스트 데이터베이스를 만들었습니다

    후, 테스트의 설정 부분에 내가 액세스 os.system를 사용

  3. 데이터로드 문제가 해결 된 방법
+2

'dumpdata --natural --exclude '를 사용할 수 있습니다. '--natural' 플래그는 django에게 기본 id를 대신하는 자연 키를 사용하도록 지시합니다. 예를 들어, ContentType 모델에 대한 모든 외래 키는'< "content-type-id> 대신'[" "", ""]'와 같이 덤프됩니다. – Ski

+0

이것은 많은 도움이되었습니다. 답변으로 제공해주십시오. – LaundroMat

답변

0

테스트 설정도 기존 데이터베이스에서 덤프 셸 내 코드에서. 그런 다음 테스트 용 데이터베이스의 덤프를로드하는 중입니다.

이렇게 작동합니다 : syncdb는 contenttype과 다른 일부 테이블을 데이터로 채 웁니다. 그런 다음 setUp 부분에서 sql 덤프를로드하는 테스트는 이전에 만든 모든 데이터를 지우고 좋은 데이터베이스를 얻습니다.)

하지 최적의 솔루션이 될 수 있지만 = 작동

+0

데이터를 어떻게로드합니까? –

+0

setUp에서 다음과 같이 호출합니다. os.system ('mysql -u root -proot test_database

+0

그러면 테스트가 특정 시스템과 완전히 연결됩니다. 그것은 좋은 해결책이지만 일반 솔루션은 아닙니다. – Barthelemy

0

내 접근 방식은 처음에 모두 도움이되지 않는 (쉬운 DB 마이그레이션을 만들기 위해 한국을 사용할 수 있지만) 좋은 한 다음 사용한다 모델 생성 방법의 모듈.

당신이 테스트 DB를 생성하여 설치 남한과

$ manage.py test my_proj 

장고를 실행하고 당신에게 완전히 업데이트 테스트 DB를 제공하기 위해 모든 마이그레이션을 실행합니다.

하려면 먼저 여기에서, test_model_factory.py를 파이썬 모듈 칼레를 작성, 테스트를 작성하여 객체를 생성 기능을 만듭니다.

def mk_user(): 
    User.objects.create(...) 

그런 다음 테스트에서 test_model_factory 모듈을 가져 와서 각 테스트에 대한 개체를 만들 수 있습니다.

def test_something(self): 
    test_user = test_model_factory.mk_user() 

    self.assert(test_user ...)