【发布时间】:2013-11-26 19:03:04
【问题描述】:
我正在尝试使用 Django/unittest 学习单元测试。
这些是我的模型的简单版本:
class Device(models.Model):
name = models.CharField(max_length=100)
def get_ips(self):
return DeviceIP.objects.filter(device=self.id)
class DeviceIP(models.Model):
ip = models.GenericIPAddressField()
device = models.ForeignKey(Device)
这是我想出的测试代码:
from django.test import TestCase
class DeviceTest(TestCase):
def test_get_ips(self):
device = Device()
device.name = 'My Device'
ip1 = DeviceIP()
ip1.ip = '127.0.0.1'
ip1.device = device
ip1.save()
ip2 = DeviceIP()
ip2.ip = '127.0.0.2'
ip2.device = device
ip2.save()
ip3 = DeviceIP()
ip3.ip = '127.0.0.3'
ip3.device = device
ip3.save()
self.assertEqual(device.get_ips(), [ip1, ip2, ip3])
测试结果失败,因为在 AssertionError 上,即使 device.get_ips() 和 [ip1, ip2, ip3] 的字符串表示形式相同。
如果我尝试使用 self.assertListEqual 会收到错误,因为 device.get_ips() 是一个 QuerySet 而不是一个列表。
如果我尝试self.assertQuerySetEqual,我会收到一条错误消息“DeviceTest object has no attribute assertQuerySetEqual”,但我不知道为什么,因为DeviceTest 扩展了django.test 的TestCase。
我应该如何做这样的测试?
另外,在“真实”项目中进行这样一个简单的测试是否有意义?
【问题讨论】:
-
您知道使用
device.deviceip_set.all()是Django 内置的方法来执行您的get_ips()方法吗?查看 Django 的文档以了解反向外键。你也不需要测试它,因为它是标准的 Django 行为。 -
感谢@Ben,我才刚刚开始学习 Django,并没有意识到这一点。我将改用这种方法。
标签: python django django-unittest python-unittest