如何在Django单元测试中使用GenericRelations?
我已经阅读和尝试了无数的建议在互联网上无济于事。
这个很有前途
但是“reset”命令在Django 1.6中已经不存在了
我的项目使用GenericForeign key指向ContentType,并使用一个外键指向auth. Users。我使用--natural选项仅转储了我的应用的数据,但这会导致测试数据库中不存在用户的问题。现在我删除了--natural选项,转而转储了所有3个应用myApp、auth、contenttypes的数据。当我运行测试时,我得到“无法加载contenttypes.ContentType(pk=50):columns app_label,model are not unique”。我认为这是由于在导入模型时动态创建了contenttype。
使用的命令:
python manage.py dumpdata auth myApp contenttypes --natural --indent=4 > auhtmtmnatural.json
接下来我转储了myApp,auth留下了contenttypes。我想既然ContentTypes应用数据库是动态创建的,而且我的fixture有自然键,这应该可以工作。
现在我得到:
DeserializationError: Problem installing fixture 'auhtmtmnatural.json': ContentType matching query does not exist.
我如何让fixutres和contentype一起工作?在测试中使用setup和创建对象是否更好?
3条答案
按热度按时间gupuwyp21#
使用
content_type: [<app_label>, <model>],
代替content_type: <hard-coded pk of model>
polhcujo2#
我知道这个问题已经提出一年多了,但是你(或其他人)可能想知道我能够使用fixture来测试一个带有ContentType的泛型外键的模型,但是需要注意的是,我必须在测试fixture中硬编码content_type_id,而且就ContentType在数据库中的创建顺序而言,这可能有点不稳定。(出于@Lara提到的原因,我开始用factory_boy重新编写我的测试)
我目前使用的是Django 1.8.3和Python 2.7.9。
关键特性似乎是加载夹具的顺序。在我的www.example.com中tests.py我有:
测试.py:
上面的gfk_model.json包含了模型的fixture,该模型包含ContentType的通用外键。my_model.json包含了Django项目或应用所需的任何模型的fixture。因此,我首先示例化了包含通用外键的模型示例。确实,它们的object_id条目引用了my_model的数据库行,而这些行还不完全存在,但是一旦加载了my_model.json fixture,它就会存在。
我的模型/models.py
GFK模型/models.py
如果我将通用外键与一个特定的ContentType相关联,那么我可以从SQL数据库或
content_type_id = ContentType.objects.get_for_model(MyModel).pk
中获得内容类型的id,在django shell(python manage.py shell
)中执行。然后我将这样获得的id(在我的例子中是13)硬编码到fixture中。最后,fixture(从dumpdata获得,然后进行编辑)看起来如下所示
gfk模型.json
我的模型.json
在gfk_model.json中,object_id 1和2分别对应my_model.json的PKs 1和2。我也为gkf_model示例提供了PKs(虽然可能不需要,也没有尝试删除它们)。
总而言之,它实际上比写这篇文章要快得多!
在测试setUp()中使用ORM也可以很直接地让GFK测试工作。
如果您有几个不同的ContentType,特别是如果它们可能会在contenttypes表中更改它们的pk,我认为fixture不会非常成功。
r8uurelv3#
有几个原因不应该使用固定装置:
您应该使用“模拟”应用程序(如Factory Boy)来代替固定装置:
http://factoryboy.readthedocs.org/en/latest/
https://pypi.python.org/pypi/factory_boy/