Django:如何为不';使用sqlite测试不会失败吗?
我正在尝试使用内存中的sqlite数据库(Django 1.6)进行测试: [设置/测试.py]: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": "", }, }
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'))