0

개발중인 앱에서 테스트를 실행하려고하는데 문제가 있습니다. 이 응용 프로그램은 구성 및 관계형 데이터 용 MySQL 데이터베이스와 관계형이 아닌 다른 레코드 용 MongoDB 데이터베이스라는 두 개의 데이터베이스를 사용합니다. 그것은 일반적으로 Y로 그냥 관계형 DB를 syncdb로 사용하고있을 때 작동합니다.하지만 테스트를 실행하려고하면 Django는 두 DB를 동기화하려고 시도하고 모델과 함께 mongo에서 오류가 발생하면서 충돌합니다. 어떤 제안? 여러 DB (MySQL 및 MongoDB)를 사용하여 Django에 대한 테스트 수행

는 DB의 구성입니다 :

DATABASES = { 
    'default': { 
      'ENGINE': 'django.db.backends.mysql', 
      'NAME': 'app', 
      'USER': 'test', 
      'PASSWORD': 'test', 
      'HOST': '127.0.0.1', 
      'PORT': '3306', 
    }, 
    'nonsql': { 
      'ENGINE' : 'django_mongodb_engine', 
      'NAME' : 'app', 
      'HOST': '127.0.0.1', 
      'PORT': 27017,   
    },   
} 

라우터 :

class AppRouter(object): 
def db_for_read(self, model, **hints): 
    if model._meta.app_label == 'nonsql': 
     return 'nonsql' 
    return None 

def db_for_write(self, model, **hints): 
    if model._meta.app_label == 'nonsql': 
     return 'nonsql' 
    return None 

def allow_relation(self, obj1, obj2, **hints): 
    if obj1._meta.app_label == 'nonsql' or \ 
     obj2._meta.app_label == 'nonsql': 
     return True 
    return None 

def allow_syncdb(self, db, model): 
    if db == 'auth_db': 
     return model._meta.app_label == 'nonsql' 
    elif model._meta.app_label == 'nonsql': 
     return False 
    return None 

테스트 코드 :

import pymongo 
from django.test import TestCase 
from app import views 
from app.models import Car 
from bson.objectid import ObjectId 
from django.test import Client 
import json 

class CarTest(TestCase): 

    def setUp(self): 
     Operation.objects.create(id = ObjectId("5396d352421aa93f63ca45d5"), name = "Test Car", description= "Test Description", 
           start_date="2011-03-26 13:54:37.355", end_date="2014-09-11 13:54:37.355") 

    def test_adding_operation(self): 
     c = Client() 
     response = c.post('/cars/',{"name":"Test car 002", "description":"Test description car 002", "start_date":"2014-09-05 13:54:37.355", "end_date":"2014-09-11 13:54:37.355"}) 
     content = json.loads(response.content) 
     # we expect to receive status success and an id 
     self.assertEqual("ok",content['status']) 
     self.assertNotEqual("",content['result'])  

답변

1

확인, 내가 일하는 해결책을 발견 보인다. .. 비록 내가 최선의 접근법인지 모르겠다. 설정에 조건을 포함 시켰습니다. 응용 프로그램이 테스트 모드에있을 때 MySQL 데이터베이스 만 사용하므로 syncdb를 수행 할 때 두 데이터베이스의 테이블을 복제하지 않습니다. 이후에는 setUp 메소드에서 test 두 번째 MongoDB를 추가하려고합니다.

Settings.py

import sys 
if 'test' in sys.argv: 
DATABASES = { 
'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'app', 
     'USER': 'test', 
     'PASSWORD': 'test', 
     'HOST': '127.0.0.1', 
     'PORT': '3306', 
},  
} 

tests.py 나는 다른 사람이 같은 상황에있는 경우이 도움이되기를 바랍니다

def setUp(self): 
    test_mongo_db = { 
      'ENGINE' : 'django_mongodb_engine', 
      'NAME' : 'test', 
      'HOST': '127.0.0.1', 
      'PORT': 27017,   
    } 
    NEW_DATABASES = settings.DATABASES 
    NEW_DATABASES['nonsql'] = test_mongo_db 

:

코드는 다음과 같이 보입니다.

+0

이 정보를 공유해 주셔서 감사합니다. –