Django:如何为不';使用sqlite测试不会失败吗?

Django:如何为不';使用sqlite测试不会失败吗?,django,sqlite,unit-testing,Django,Sqlite,Unit Testing,我正在尝试使用内存中的sqlite数据库(Django 1.6)进行测试: [设置/测试.py]: DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:", "USER": "", "PASSWORD": "", "HOST": "", "PORT": "", }, }

我正在尝试使用内存中的sqlite数据库(Django 1.6)进行测试:

[设置/测试.py]:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": ":memory:",
        "USER": "",
        "PASSWORD": "",
        "HOST": "",
        "PORT": "",
    },
}
我需要将以下内容传递到选择字段

def VERSIONS():
    v_win_car = Version.objects.filter(
        platform='WIN',
        section='CAR',
        language='EN').order_by('-official_date')[:5]
    VCAR = [[b.version + '-' + b.section, b.version + '-' + b.section] for b in
            v_win_car]

    v_win_bike = Version.objects.filter(
        platform='WIN',
        section='BIKE',
        language='EN').order_by('-official_date')[:5]
    VBIKE = [[b.version + '-' + b.section, b.version + '-' + b.section] for b in
             v_win_bike]

    return VCAR + VBIKE
(现在它被封装在一个函数中,因为我试图解决这个问题,起初它很简单 版本=VCAR+VBIKE)

形式如下:

version = forms.ChoiceField(choices=VERSIONS())
如果我使用本地设置和mysql数据库运行测试,它不会抱怨,但是当我使用sqlite数据库的测试设置时,它会失败(也使用sqlite数据库文件test.db):

正在为别名“default”创建测试数据库。。。
E
======================================================================
错误:control.tests.test_视图(unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
导入错误:无法导入测试模块:control.tests.test\u视图
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python2.7/unittest/loader.py”,第252行,在“查找”测试中
module=self.\u从\u name(name)获取\u module\u
文件“/usr/lib/python2.7/unittest/loader.py”,第230行,在_get_module_from_name中
__导入(名称)
文件“/vagrant_data/projects/compdealer16/compdealer/control/tests/test_views.py”,第7行,在
从control.view导入VistaJsonGetNextVersion、crear_版本
文件“/vagrant_data/projects/compdealer16/compdealer/control/views.py”,第25行,在
从.forms导入RenoveForm、AddEquipmentForm、AddSoftwareForm、QueryForm
文件“/vagrant_data/projects/compdealer16/compdealer/control/forms.py”,第309行,在
类附录设备表(forms.Form):
文件“/vagrant_data/projects/compdealer16/compdealer/control/forms.py”,第338行,在AddEquipmentForm中
version=forms.ChoiceField(choices=VERSIONS())
文件“/vagrant_data/projects/compdealer16/compdealer/control/forms.py”,第57行,版本
v_win_car]
文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/models/query.py”,第96行,在__
self._fetch_all()
文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/models/query.py”,第854行,在_fetch_all中
self.\u result\u cache=list(self.iterator())
迭代器中的文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/models/query.py”,第220行
对于编译器.results\u iter()中的行:
文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第710行,结果文件
对于self.execute_sql(多)中的行:
文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第781行,在execute\u sql中
cursor.execute(sql,params)
文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/backends/util.py”,执行中的第53行
返回self.cursor.execute(sql,params)
文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/utils.py”,第99行,在退出时__
6.重新播放(dj_exc_类型、dj_exc_值、回溯)
文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/backends/util.py”,执行中的第53行
返回self.cursor.execute(sql,params)
文件“/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site packages/django/db/backends/sqlite3/base.py”,第450行,在execute中
返回Database.Cursor.execute(self、query、params)
操作错误:没有这样的表:versiones\u version
----------------------------------------------------------------------
在0.000秒内运行了1次测试
失败(错误=1)
正在销毁别名“default”的测试数据库。。。
据我所知,它试图在导入时在尚未创建表时计算记录集

有什么办法解决这个问题吗

(同样,如果您发现此问题有更好的标题…

选项1:使用:

选项2:在创建表单(或在其构造函数中)后立即更改选择:


(每次创建表单时最好查询数据库)

显示您的所有设置和项目tree@lalo,我的基本设置是,添加的测试设置是。@lalo,谢谢@Udi,我在可以使用查询集的情况下使用了第一个选项。在这种情况下,使用ModelChoiceField解决了问题。但第二个选项允许我从数据库中创建自定义列表,而不会使SQLite的测试失败。谢谢!
    Creating test database for alias 'default'...
E
======================================================================
ERROR: control.tests.test_views (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
ImportError: Failed to import test module: control.tests.test_views
Traceback (most recent call last):
  File "/usr/lib/python2.7/unittest/loader.py", line 252, in _find_tests
    module = self._get_module_from_name(name)
  File "/usr/lib/python2.7/unittest/loader.py", line 230, in _get_module_from_name
    __import__(name)
  File "/vagrant_data/projects/compdealer16/compdealer/control/tests/test_views.py", line 7, in <module>
    from control.views import VistaJsonGetNextVersion, crear_VERSIONS
  File "/vagrant_data/projects/compdealer16/compdealer/control/views.py", line 25, in <module>
    from .forms import RenoveForm, AddEquipmentForm, AddSoftwareForm, QueryForm
  File "/vagrant_data/projects/compdealer16/compdealer/control/forms.py", line 309, in <module>
    class AddEquipmentForm(forms.Form):
  File "/vagrant_data/projects/compdealer16/compdealer/control/forms.py", line 338, in AddEquipmentForm
    version = forms.ChoiceField(choices=VERSIONS())
  File "/vagrant_data/projects/compdealer16/compdealer/control/forms.py", line 57, in VERSIONS
    v_win_car]
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/models/query.py", line 96, in __iter__
    self._fetch_all()
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/models/query.py", line 854, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/models/query.py", line 220, in iterator
    for row in compiler.results_iter():
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 710, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 781, in execute_sql
    cursor.execute(sql, params)
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/utils.py", line 99, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "/home/vagrant/.virtualenvs/dealerRC/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 450, in execute
    return Database.Cursor.execute(self, query, params)
OperationalError: no such table: versiones_version


----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)
Destroying test database for alias 'default'...
version = forms.ModelChoiceField(queryset=Version.objects.filter(...))
form = MyForm()
form.fields['version'].choices = ((1, 'One'), (2, 'Two'))