2010-12-10 38 views
5

这只是一个理论,我想根据别人的反馈和可能类似的经验来弄清楚。Django SQLite测试怪胎:不同的执行路径?

一直在使用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() 

有多种像这样的失败,但只是指出一对夫妇。问题很明显。网站模型没有实际数据,但文件包含试图获取当前网站模型或特定实例的代码。

现在,我可以想到一个简单的解决方案:OneToOneField应该切换到使用limit_choices_to功能,第二个是相同的。然后在需要时调用函数,而不是Django对文件进行初始扫描。

但是,我的实际问题是:为什么会发生SQLite而不是mySQL?。两种数据库引擎是否有不同的测试方式?我不这么认为,因为Python正在完成所有模型的编译。

究竟发生了什么?

干杯。

+0

您是否认为每次运行测试时都会新建并清空sqlite数据库,而mysql数据库可能与您在生产/开发中使用的数据库相同,并且其中已有更多数据? – 2010-12-11 01:06:11

+0

mySQL数据库也是每次创建一个新的。 – Bartek 2010-12-13 14:22:41

+0

你在模型中的哪个地方叫做Site.objects.get_current()?它是在save()方法还是在一个信号中? – 2010-12-20 10:21:52

回答

1

是否有某些原因您不是mocking访问数据库?当你添加一个数据库(不管是什么数据库)到混合物时,你的UT边界变得非常宽。它开始看起来更像是一个集成测试,而不是单元测试。