1

我使用 django 1.3、Mongodb 和 django-mongo-engine 建立了一个网站。当我使用“manage.py runserver”运行服务器时,它是成功的。但是当我尝试通过“manage.py test”进行单元测试时,它以某种方式失败了。

这是关于数据库的settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django_mongodb_engine', 
        'NAME': 'sean_test',                     
        'USER': '',                    
        'PASSWORD': '',                  
        'HOST': '',                      
        'PORT': '',                      
    }
}

这是测试中的错误消息:

....问题安装夹具 'c:\Python27\lib\sitepackages\django\contrib\auth\fixtures\authtestdata.json':回溯(最近一次通话最后):

文件“c:\Python27\lib\site-packages\django\core\management\commands\loaddata.py”,第 174 行,在 handleobj.save(using=using)

文件“c:\Python27\lib\site-packages\django\core\serializers\base.py”,第 165 行,在 savemodels.Model.save_base(self.object, using=using, raw=True)

文件“c:\Python27\lib\site-packages\django\db\models\base.py”,第 573 行,在 save_baseresult = manager._insert(values, return_id=update_pk, using=using)

文件“c:\Python27\lib\site-packages\django\db\models\manager.py”,第 195 行,在 _insertreturn insert_query(self.model, values, **kwargs)

文件“c:\Python27\lib\site-packages\django\db\models\query.py”,第 1438 行,在 insert_queryreturn query.get_compiler(using=using).execute_sql(return_id)

文件“c:\Python27\lib\site-packages\djangotoolbox\db\basecompiler.py”,第 369 行,在 execute_sqlvalue = self.convert_value_for_db(db_type, value)

文件“c:\Python27\lib\site-packages\django_mongodb_engine\compiler.py”,第 67 行,在 wrapperreturn func(*args, **kwargs)

文件“c:\Python27\lib\site-packages\django_mongodb_engine\compiler.py”,第 307 行,在 convert_value_for_dbraise InvalidId(msg)

InvalidId:AutoField(默认主键)值必须是表示 MongoDB 上的 ObjectId 的字符串(取而代之的是 u'1')

我知道 django 使用整数,而 mongodb 使用字符串作为主键,但我不知道为什么“runserver”成功时测试会失败。关于如何解决这个问题的任何想法?

谢谢!

4

2 回答 2

0

所以看起来你在运行测试时没有连接到 mongodb 实例的测试设置,因为你是从命令行运行它的,也许可以尝试做这样的事情

您有 2 个设置文件,不连接的 lsettings.py 和不连接的 settings.py

from lsettings import *
mongodb.connect()

So, while locally testing you can:

python manage.py test --settings=lsettings

希望这可以解决您的问题。:)

于 2013-02-04T23:35:47.693 回答
0

问题在于加载固定装置,如后面的问题中所述。

您可以通过使用相应答案中所述的正确 ObjectId 替换固定装置中的 id 来修复它。

从您的回溯来看,问题出在由django.contrib.auth. 由于这些与 ObjectId 不兼容,您需要更新您的测试以使用不同的夹具,或者如果您无法更新它们,则跳过失败的测试。例如,Django 的身份验证测试不会通过。

于 2013-12-26T11:16:37.320 回答