我在 Debian 上使用 Django 1.2.3-3+squeeze1 和 PostgreSQL 8.4.7-0squeeze2(虽然我认为 PostgreSQL 在这里不相关),并使用以下 setUp 和 tearDown 运行基于 unittest 的 Django 单元测试
def setUp(self):
print "running setup"
self.c = Client()
self.user = User.objects.create_user('faheem', 'faheem@email.unc.edu', 'foo')
self.logged_in = self.c.login(username='faheem', password='foo')
settings.MEDIA_ROOT='/tmp/'
#settings.ZIP_UPLOAD='/var/tmp/zip/'
def tearDown(self):
print "running teardown"
FolderUpload.objects.all().delete()
FileUpload.objects.all().delete()
ZipFileUpload.objects.all().delete()
OldFileUpload.objects.all().delete()
# FIXME: Quick & dirty fix for the time being. Should make this a delete method.
os.system("rm -rf "+ settings.ZIP_UPLOAD + "/*")
这个想法是在运行单元测试之间从数据库中删除所有内容。根据 unittest 文档,这就是tearDown
目的。我遇到的问题是在不同的单元测试之间似乎仍然保存了一些状态。具体来说,我看到 id 增加了。所以假设我在 中创建一个ZipFileUpload
对象test1
,然后在 中创建一个ZipFileUpload
对象test2
,那么我希望两个 id 都是1
,但我看到的是 id 1
fortest1
和 id 2
fortest2
. 如果 id 来自位于这些表之外的某个索引,这将是有意义的。我对 Diago 是如何做到这一点的了解还不够,无法知道事实是否如此。如果他们这样做,我不知道为什么。对这一点的任何澄清将不胜感激。
无论如何,如果有人可以建议的话,我会选择一种干净的方式来删除数据库。这个方法大概应该进入teadDown
. 测试 Django 应用程序提到了以下功能,但我未能从django.test.utils
. 令人困惑的是,这个功能似乎在django/db/backends/creation.py
.
destroy_test_db(old_database_name, verbosity=1)
销毁名称存储在 DATABASES 中的 NAME 中的数据库,并将 NAME 设置为使用提供的名称。
这句话的第一部分是 Ok - “Destroy the database which name is stored in NAME in the DATABASES”,但是“sets NAME to use the provided name”是什么意思呢?我假设提供的名称old_database_name
是
目前尚不清楚NAME
上下文中的内容。是NAME
inDATABASES
吗,如果是这样,为什么我需要设置已经设置的东西?我假设提供的名称是old_database_name
,但如果是这样,我为什么要将它设置为一个名为 的参数old_database_name
?这句话在开发文档中没有改变。
编辑:
在史蒂夫·梅恩(Steve Mayne)的回复(见下文)之后,我想我会详细说明一下这件事的背景。
此应用程序最初是在 2007/2008/2009 年编写的,包括单元测试。在大部分时间里,我都在使用 Django 的 1.0 之前的版本。根据Ken Cochran 的 Django Release History,1.0 于 2008 年 9 月 3 日发布。描述的设置在那段时间运行良好。我看到上面的 tearDown 函数最初是在 2007 年 12 月编写的。那么,也许 Django 的行为改变了?
事后看来,我意识到像tearDown
上面那样清空表并不能保证 id 计数将重置为1
,因为序列可以是表中的单独对象。
感谢史蒂夫的解决方案。如果它存在,我想听听关于序列重置的便携式解决方案。我也对如何使上述destroy_test_db
功能起作用的解释感兴趣。