我正在尝试对我正在开发的应用程序运行测试,但我遇到了问题。该应用程序使用2个数据库,一个用于配置和关系数据,一个用于其他一些非关系数据的MongoDB数据库。当我正常使用它时,它可以正常运行,因为我只是同步关系数据库...但是当我尝试运行测试时,Django正试图同步两个数据库然后崩溃,因为它在mongo模型中出现了一些错误。有什么建议吗?
这是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'])
答案 0 :(得分:0)
好吧,我似乎找到了一个有效的解决方案......即使我不确定是最好的方法。 我在设置中包含了一个条件,所以当应用程序处于测试模式时,它只使用MySQL数据库,所以当它执行syncdb时,它不会复制两个数据库中的表,之后,在测试的setUp方法中我正在添加第二个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
如果其他人处于相同的情况,我希望这会有所帮助。