对Django查询进行单元测试

2024-05-14 02:03:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用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()是一个查询集,而不是一个列表。

如果我尝试self.assertQuerySetEqual,我会得到一个错误,说“DeviceTest object has no attribute assertQuerySetEqual”,但我不确定为什么,因为DeviceTest扩展了django.test的测试用例。

我应该怎么做这样的测试?

另外,在一个“真实”的项目中,做这样一个简单的测试有意义吗?


Tags: testselfipgetmodelsdevicesaveclass