命令行Django测试报错:<model name>匹配查询不存在

Django test error in command line: <model name> matching query does not exist

这是我的 tests.py 文件:

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

class ArticleTestCase(TestCase):

    @classmethod
    def setup(self):
        Article.objects.create(
            article_title="title1",
            article_content="content of article",
        )

    def test_article_title(self):
        a1 = Article.objects.get(pk=1)
        article_name = a1.article_title
        self.assertEquals(article_name, 'title1')

但是,我总是收到这个错误:

Traceback (most recent call last):
File "F:\Django_Blog_Live\swagato_blog_site\blog_api\tests.py", line 16, in test_article_title
a1 = Article.objects.get(pk=1)
File "F:\Django_Blog_Live\env\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
File "F:\Django_Blog_Live\env\lib\site-packages\django\db\models\query.py", line 415, in get
raise self.model.DoesNotExist(
blog_api.models.Article.DoesNotExist: Article matching query does not exist.

错误描述指向这个语句:a1 = Article.objects.get(pk=1)

我做错了什么?

setup 不是方法的正确名称。正确的名称是 setUp(注意大写 U)。而且 不是 而是 classmethod.

还有另一种方法叫做 setUpClass,它 一个 classmethod

两者之间的区别在于setUp是每个测试方法之前的运行,而setUpClass是整个测试用例的运行一次。

用法:

使用setUp方法很简单:

class ArticleTestCase(TestCase):
    def setUp(self):
        # create objects
        # ...

在 Django 中,如果您使用 setUpClass,您还需要对父 class:

进行 super 调用
class ArticleTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass() # call parent

        # create objects
        # ...