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
相关产品推荐
相关产品推荐

