【发布时间】:2018-03-31 18:01:12
【问题描述】:
我有一个模型叫Pdb:
class Pdb(models.Model):
id = models.TextField(primary_key=True)
title = models.TextField()
与模型Residue是一对多的关系:
class Residue(models.Model):
id = models.TextField(primary_key=True)
name = models.TextField()
pdb = models.ForeignKey(Pdb)
单元测试Pdb 很好:
def test_can_create_pdb(self):
pdb = Pdb(pk="1XXY", title="The PDB Title")
pdb.save()
self.assertEqual(Pdb.objects.all().count(), 1)
retrieved_pdb = Pdb.objects.first()
self.assertEqual(retrieved_pdb, pdb)
当我对Residue 进行单元测试时,我只想使用一个模拟 Pdb 对象:
def test_can_create_residue(self):
pdb = Mock(Pdb)
residue = Residue(pk="1RRRA1", name="VAL", pdb=mock_pdb)
residue.save()
但这失败了,因为它需要一些名为_state的属性:
AttributeError: Mock object has no attribute '_state'
所以我不断添加模拟属性使其看起来像一个真实的模型,但最终我得到了:
django.db.utils.ConnectionDoesNotExist: The connection db doesn't exist
我不知道如何模拟对数据库的实际调用。有没有标准的方法来做到这一点?我真的不想在测试数据库中实际创建 Pdb 记录,因为那样测试就不会被隔离。
是否有既定的最佳实践方法来做到这一点?
我获得的大部分 SF 和 google 结果都与模拟模型的特定方法有关。任何帮助将不胜感激。
【问题讨论】:
标签: django unit-testing django-models orm tdd