1

我现在正在对已经存在的代码进行单元测试。我面临下一个问题:

在运行 syncdb 创建测试数据库后,Django 会自动填充几个表,如 django_content_type 或 auth_permissions。

然后,想象一下我需要运行一个复杂的测试,比如检查用户注册,这将需要大量的数据表和它们之间的连接。

如果我尝试使用我现有的整个数据库来制作夹具(这对我来说相当方便) - 我会收到类似这里的错误。发生这种情况是因为 Django 已经填充了 django_content_type 之类的表。

下一种可能的方法是使用 django dumpdata --exclude 选项来填充已填充的 syncdb 表。但这也不能很好地工作,因为如果我从我的数据库和用户权限表中获取用户和用户组对象,这是由 syncdb 自动创建的,我会收到错误,因为连接它们的主键现在指向错误。在“夹具地狱”部分更好地描述,但那里显示的解决方案看起来不太好)

我看到的下一个可能的方案是下一个:

  1. 我正在运行我的测试;Django 创建测试数据库,创建 syncdb 并创建所有这些表。
  2. 在我的测试设置中,我删除了这个数据库,创建了新的空白数据库。
  3. 也在测试设置中从现有数据库加载数据转储
4

2 回答 2

0

问题就是这样解决的:

在 syncdb 创建了测试数据库之后,在我用来os.system从我的代码访问 shell 的部分测试中。然后我只是加载数据库的转储,我想将其用于测试。

所以它的工作原理是这样的:syncdb 用数据填充 contenttype 和其他一些表。然后在测试的 setUp 部分加载 sql 转储清除所有以前创建的数据,我得到一个不错的数据库。

可能不是最好的解决方案,但它有效=)

于 2010-03-26T17:33:19.627 回答
0

我的方法是首先使用 South 使数据库迁移变得容易(这根本没有帮助,但是很好),然后使用模型创建方法模块。

当你跑

  $  manage.py test my_proj

安装了 South 的 Django 创建了测试数据库,并运行所有迁移,为您提供一个完全更新的测试数据库。

要编写测试,首先创建一个 python 模块调用 test_model_factory.py 在这里创建创建对象的函数。

def mk_user():
   User.objects.create(...)

然后在您的测试中,您可以导入您的 test_model_factory 模块,并为每个测试创建对象。

  def test_something(self):
     test_user = test_model_factory.mk_user()

     self.assert(test_user ...)
于 2010-07-22T23:02:28.103 回答