为何我的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
相关产品推荐
相关产品推荐

