这只是我想根据其他人的反馈和可能类似的经验得出的理论。
一直在使用 mySQL 运行测试,但当然,内存中的 SQLite 数据库要快得多。但是,它似乎遇到了一些问题。
当 DATABASE_ENGINE
设置为使用 django.db.backends.sqlite3
并且我运行 manage.py test
时,输出不是希望:
(删除了大部分行,但指出了有趣的失败点)
$ python manage.py test Traceback (most recent call last): File "manage.py", line 12, in execute_manager(settings) File "/Users/bartekc/.virtualenvs/xx/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager utility.execute() File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 51, in class AcvTripIncentive(models.Model): # First interesting failure File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 55, in AcvTripIncentive trip = models.OneToOneField(Trip, limit_choices_to={'sites' : Site.objects.get(name='ZZ'), 'is_active' : True,}) # Next interesting failure File "/Users/bartekc/domains/xx/xx/associates/yyz/models.py", line 252, in current_site = Site.objects.get_current()
有多个像这样的失败,但只是指出了几个。问题很明显。 Site 模型没有实际数据,但文件包含尝试获取 Site 模型下的当前或特定实例的代码。
现在,我可以想到一个简单的解决方案:应该将 OneToOneField
切换为使用带有 limit_choices_to
的函数,第二个相同。然后在需要时调用这些函数,而不是在 Django 初始扫描文件时调用。
但是,我的实际问题是:为什么 SQLite 而不是 mySQL 会发生这种情况?。两个数据库引擎通过测试进行处理的方式是否不同?我不这么认为,因为 Python 正在完成模型的所有编译工作。
这里到底发生了什么?
干杯。
最佳答案
你不是有什么原因吗 mocking访问数据库?当您向混合物中添加数据库(无论是什么数据库)时,您的 UT 边界会变得非常宽。它开始看起来更像是集成测试而不是单元测试。
关于python - Django SQLite 测试异常 : Different path of execution?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4410898/