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

为何我的Django测试本该失败却意外通过?

问题疑惑:自定义模型create方法未存库,但测试用例却通过?

我是编程测试领域的新手,这是针对之前问题的后续问询。之前的回答指出,如下这类自定义的模型类方法不会将对象保存到数据库:

@classmethod
def create(cls, user, name):
    list = cls(user=user, name=name) 
    return list

但我写的如下测试用例却显示通过,对此我感到疑惑:

from django.test import TestCase
from .models import List
from django.contrib.auth.models import User

class ListTestCase(TestCase):
    def setUp(self):
        user_1 = User(username="test_user", password="abcd")
        user_1.save()
        List.objects.create(user=user_1, name="mylist")
        List.objects.create(user=user_1, name="anotherlist")
        
    def test_lists_is_created(self):
        user_1 = User.objects.get(username="test_user")
        list_1 = List.objects.get(user=user_1, name="mylist")
        self.assertEqual("mylist", list_1.name)

原因很简单:你的测试用例完全没用到自定义的create方法!

你在setUp里用的是List.objects.create()——这是Django ORM内置的方法,它内部会自动调用save()把对象写入数据库。而你自己写的create方法只是初始化了一个模型实例,根本没调用save(),所以不会把数据存到数据库,但你的测试从头到尾都没碰这个自定义方法,自然能从数据库查到数据,测试也就通过了。

如果要验证自定义方法的问题,你可以修改测试用例,换成调用自己写的create方法:

def setUp(self):
    user_1 = User(username="test_user", password="abcd")
    user_1.save()
    # 使用自定义的create方法,不调用save
    List.create(user=user_1, name="mylist")
    List.objects.create(user=user_1, name="anotherlist")

这时候再运行测试,test_lists_is_created就会失败,因为"mylist"这条数据根本没有被保存到数据库中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:06:27