You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django单元测试报错:relation 'iptoc'不存在,视图查询正常

解决Django单元测试中找不到managed=False模型对应表的问题

问题原因

Django的TestCase会自动创建临时测试数据库,仅为managed=True的模型生成表结构。你的Iptoc模型设置了managed=False,测试数据库中不会自动创建该表,因此查询时抛出"relation 'iptoc' does not exist"错误。


方案1:手动在测试中创建表并添加测试数据

在测试类的setUp方法中,直接执行SQL创建iptoc表,并插入视图查询所需的测试数据:

from django.db import connection
from django.test import TestCase
from django.urls import reverse
from yourapp.models import Iptoc  # 替换为你的app名称

class HomeTests(TestCase):
    def setUp(self):
        # 执行建表SQL(请根据生产环境的iptoc表结构调整)
        with connection.cursor() as cursor:
            cursor.execute("""
                CREATE TABLE iptoc (
                    id_ip integer PRIMARY KEY,
                    ip_from integer NOT NULL,
                    ip_to integer NOT NULL,
                    country_code2 character varying(2) NOT NULL,
                    threecode character varying(3) NOT NULL,
                    country_name character varying(40) NOT NULL
                );
            """)
        # 插入匹配视图中x=18874378的测试数据
        Iptoc.objects.create(
            id_ip=1,
            ip_from=10000000,
            ip_to=20000000,
            country_code2='US',
            threecode='USA',
            country_name='United States'
        )

    def test_home_view_status_code(self):
        url = reverse('country')
        response = self.client.get(url)
        self.assertEquals(response.status_code, 200)

方案2:用Mock隔离数据库依赖(推荐单元测试使用)

通过unittest.mock模拟Iptoc.objects.get的返回结果,无需操作数据库,实现测试逻辑与外部依赖的隔离:

from unittest.mock import patch
from django.test import TestCase
from django.urls import reverse

class HomeTests(TestCase):
    @patch('yourapp.views.Iptoc.objects.get')  # 替换为视图所在的实际路径
    def test_home_view_status_code(self, mock_get):
        # 创建模拟的Iptoc实例
        mock_record = type('MockIptoc', (), {'country_name': 'Test Country'})()
        mock_get.return_value = mock_record

        url = reverse('country')
        response = self.client.get(url)
        self.assertEquals(response.status_code, 200)
        # 验证查询参数是否符合预期
        mock_get.assert_called_once_with(ip_to__gte=18874378, ip_from__lte=18874378)

注意事项

  • 方案1适合集成测试,验证视图与数据库的完整交互逻辑;方案2适合单元测试,专注于视图本身的业务逻辑,避免外部依赖影响测试结果。
  • 使用方案1时,务必保证建表SQL与生产环境的iptoc表结构完全一致,避免字段不匹配问题。

内容的提问来源于stack exchange,提问作者Alvar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:15:08