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

Django测试无法获取Model对象问题及解决方法

Django测试数据库为空的问题:原因与解决办法

你碰到的这个情况完全是Django测试套件的正常机制,不用困惑~

Django的测试框架会为每个测试方法单独创建一个全新的空测试数据库,测试结束后又自动销毁它。这么做的目的是保证每个测试都能在独立、干净的环境里运行,避免不同测试之间的数据互相干扰。

而你在本地shell里操作的是平时开发用的数据库,里面已经有你手动添加的Ad数据,所以Ad.objects.first()能拿到结果;但测试用的是临时空库,自然返回None,也就导致创建Impression时触发了ValueError。

解决办法:添加测试数据初始化方法

要让测试正常运行,你需要在测试类里添加setUp()方法,它会在每个测试执行前自动调用,帮你初始化必要的测试数据。你更新的代码就很合适,我再整理得更清晰一点:

from django.test import TestCase
from django.core.files.uploadedfile import SimpleUploadedFile
from django.contrib.auth.models import User
from django.urls import reverse  # 别忘了导入reverse
from .models import Ad
import os

class AdvertisingTests(TestCase):
    def setUp(self):
        # 先创建测试用户(因为Ad关联了User)
        test_user = User.objects.create_user(username='testuser', password='12345')
        
        # 拼接测试图片的绝对路径
        this_path = os.path.abspath(os.path.dirname(__file__))
        banner_image_path = os.path.join(this_path, "static/advertising/images/pic01.jpg")
        mobile_image_path = os.path.join(this_path, "static/advertising/images/pic02.jpg")
        
        # 创建测试用的Ad数据
        Ad.objects.create(
            title="Test Title",
            desc="Test Description",
            image=SimpleUploadedFile(
                name='test_banner.jpg',
                content=open(banner_image_path, 'rb').read(),
                content_type='image/jpeg'
            ),
            mobile_image=SimpleUploadedFile(
                name='test_mobile.jpg',
                content=open(mobile_image_path, 'rb').read(),
                content_type='image/jpeg'
            ),
            url="https://www.jefferythewind.com",
            user=test_user
        )

    def test_get_ad(self):
        ''' Test if the get ad feature is working, should always load an ad '''
        url = reverse('advertising:get_ad')
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)

额外提示

  • 确保测试图片的路径正确,测试环境下能正常读取到这些文件;
  • 每个测试方法执行前,setUp()都会重新初始化数据,所以不用担心测试之间的数据污染;
  • 如果你有多个测试方法,它们都会基于这个干净的初始化数据运行,保证测试结果的准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:39:14