python - 为什么在Django单元测试期间我的表不可用?

标签 python django sqlite unit-testing django-south

当我尝试运行单元测试时,出现一个错误,提示数据库中没有可用的表。一天前,我的测试运行良好,并且就此后发生的变化进行了集思广益,没有想到任何可能导致此问题的事情。

我认为这是syncdbSouthsqlite数据库中无法正确创建表的问题,并已尝试解决此问题。

带回溯的错误消息

$ ./manage.py test --settings=settings.test -v2

Creating test database for alias 'default' (':memory:')...
Syncing...
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table south_migrationhistory
Installing custom SQL ...
Installing indexes ...

Synced:
 > grappelli
 > django.contrib.admin
 > django.contrib.admindocs
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.messages
 > django.contrib.sessions
 > django.contrib.sites
 > django.contrib.staticfiles
 > crispy_forms
 > floppyforms
 > south
 > subdomains
 > widget_tweaks

Not synced (use migrations):
 - apps.application
 - apps.app_app
 - apps.accounts
 - apps.rampup
 - apps.students
 - apps.automated_responses
(use ./manage.py migrate to migrate these)

======================================================================
ERROR: test_can_save_form_with_clean_passwords (apps.accounts.tests.test_admin.TestCreateUserForm)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/chaz/dev/projects/si/apps/accounts/tests/test_admin.py", line 17, in setUp
    self.user = SIDummyUserFactory.create()
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/factory/base.py", line 452, in create
    attrs = cls.attributes(create=True, extra=kwargs)
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/factory/base.py", line 316, in attributes
    force_sequence=force_sequence,
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/factory/containers.py", line 263, in build
    sequence = self.factory._generate_next_sequence()
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/factory/base.py", line 287, in _generate_next_sequence
    cls._next_sequence = cls._setup_next_sequence()
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/factory/django.py", line 71, in _setup_next_sequence
    ).order_by('-pk')[0]
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/django/db/models/query.py", line 231, in __getitem__
    return list(qs)[0]
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/django/db/models/query.py", line 108, in __len__
    self._result_cache.extend(self._iter)
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/django/db/models/query.py", line 1140, in iterator
    for row in self.query.get_compiler(self.db).results_iter():
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 775, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
    cursor.execute(sql, params)
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 366, in execute
    six.reraise(utils.DatabaseError, utils.DatabaseError(*tuple(e.args)), sys.exc_info()[2])
  File "/Users/chaz/dev/envs/startupinst/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 362, in execute
    return Database.Cursor.execute(self, query, params)
DatabaseError: no such table: accounts_siuser


相关设置

INSTALLED_APPS

In [2]: settings.INSTALLED_APPS  
Out[2]:
('grappelli',  
 'django.contrib.admin',  
 'django.contrib.admindocs',  
 'django.contrib.auth',  
 'django.contrib.contenttypes',  
 'django.contrib.messages',  
 'django.contrib.sessions',  
 'django.contrib.sites',  
 'django.contrib.staticfiles',  
 'crispy_forms',  
 'floppyforms',  
 'south',  
 'subdomains',  
 'widget_tweaks',  
 'gunicorn',  
 'apps.application',  
 'apps.app_app',  
 'apps.automated_responses',  
 'apps.accounts',  
 'apps.rampup',  
 'apps.students',  
 'utils.context_processors',  
 'discover_runner')  


pip freeze --local

 Django==1.5.4  
 Pygments==1.6  
 South==0.7.6  
 argparse==1.2.1  
 bpython==0.12  
 coverage==3.6  
 dj-database-url==0.2.1  
 django-braces==1.2.2  
 django-crispy-forms==1.2.2  
 django-debug-toolbar==0.9.4  
 django-discover-runner==0.4  
 django-filepicker==0.1.4  
 django-floppyforms==1.1  
 django-grappelli==2.4.4  
 django-parsley==0.0.2a0  
 django-subdomains==2.0.1  
 django-templated-email==0.4.7  
 django-widget-tweaks==1.1.2  
 envoy==0.0.2  
 factory-boy==2.1.1  
 gunicorn==0.16.1  
 ipdb==0.7  
 ipython==0.13.2  
 psycopg2==2.4.5  
 pytz==2013b  
 requests==2.0.0  
 simplejson==3.3.1  
 six==1.4.1  
 stripe==1.7.7  
 zulip==0.2.1  


设置/ test.py

""" Test settings and globals which allow us to write our tests locally."""
from .common import *

########
# APPS #
########
INSTALLED_APPS += (
    'discover_runner',
)

#################
# TEST SETTINGS #
#################
#TEST_RUNNER = 'django_pytest.test_runner.TestRunner'
TEST_RUNNER = "discover_runner.DiscoverRunner"
TEST_DISCOVER_TOP_LEVEL = PROJECT_ROOT
TEST_DISCOVER_PATTERN = "test_*"
SOUTH_TESTS_MIGRATE = False


###########################
# IN MEMORY TEST DATABASE #
###########################

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": ":memory:",
    },
}


不能解决问题的类似SO问题


Does South foul up the Django test runner framework
Disable South when running Django unit tests
Missing table when running django unittest with sqlite2


到目前为止我尝试过的


在另一个分支上运行测试,在发生这种情况的过程中没有改变
结果:得到相同的确切错误和引用
吹走我的虚拟环境并开始一个新的虚拟环境
结果:无变化

最佳答案

我最终从我的South文件*中删除了settings/test.py,并且数据库已正确创建。很想听听是否有人对此有任何想法。以下设置应禁用South,从而导致Django的syncdb创建正确的表。

SOUTH_TESTS_MIGRATE = False  
SOUTH_SKIP_TESTS = True


*我有每种环境的设置文件,因此只需将South放在需要它的文件中,而不是将它们放在它们都继承自的base.py中。

关于python - 为什么在Django单元测试期间我的表不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276830/

相关文章:

python - 如何使用带有 -l 或 --no input 等选项的 call_command 以编程方式调用 collectstatic 管理命令

python - Django 管理员导致 AttributeError

ios - 备份和接收核心数据 SQlite3 数据库

python - pandas reshape 日期序列

python - 我如何在 Python 中编写此 Java 代码?

python - 启动 Django 项目无效语法

sql - 使用 json_extract 查找 JSON 数组中的所有对象

python - 需要帮助从 csv 中提取数据并写入文本文件

python - django-social-auth : How to redirect example. com 到 127.0.0.1 :8000?

node.js - 使用 SQLite3 进行单元测试