首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ManyToManyField的Django SetUpTestData导致数据库错误

问ManyToManyField的Django SetUpTestData导致数据库错误
EN

Stack Overflow用户
提问于 2019-12-24 01:59:03
回答 1查看 183关注 0票数 1

我正在尝试使用测试运行器测试Django应用程序。我想设置一次测试数据,以便在几个不同的测试类中运行,而不是在每个测试类中设置相同的数据。出于这个原因,我使用setUpTestData()而不是setUp()。该模型包括一个将协作者连接到文章的ManyToManyField。当我设置一个类来使用setUpTestData()测试模型时,我能够从Collaborator模型和Article模型中保存和检索对象。

然而,当我尝试保存多对多关系时,我得到一个错误,即该表不存在。如何设置测试以重用这些数据,包括多对多关系。

下面是我的代码:

代码语言:javascript
复制
from django.test import TestCase

from cv.settings import PUBLICATION_STATUS, STUDENT_LEVELS
from cv.models import Article, ArticleAuthorship, Collaborator

from tests.cvtest_data import PublicationTestCase

class ArticleTestCase(TestCase):
    """
    Run tests of Django-CV :class:`~cv.models.Article` model.
    """
    @classmethod
    def setUpTestData(cls):
        # Collaborator
        cls.col_einstein = Collaborator.objects.create(
            first_name="Albert", last_name="Einstein", email="ae@example.edu"
        )

        # Article
        cls.art_gravitation = Article.objects.create(
            title='On the Generalized Theory of Gravitation', short_title='Generalized Theory of Gravitation',
            slug='gen-theory-gravitation', pub_date='1950-04-01',
            status=PUBLICATION_STATUS['PUBLISHED_STATUS']
        )

        # Authorship: ManyToManyField
        cls.auth = ArticleAuthorship(
            article=cls.art_gravitation,
            collaborator=cls.col_einstein,
            display_order=1
            )
        cls.auth.save()

    def test_article_string(self):
        """Test that model returns short title of article as string"""
        a = Article.objects.get(
            short_title="Generalized Theory of Gravitation")
        self.assertEqual(a.__str__(), "Generalized Theory of Gravitation")

我得到的错误是:

代码语言:javascript
复制
======================================================================
ERROR: test suite for <class 'tests.test_article2.ArticleTestCase'>
----------------------------------------------------------------------
Traceback (most recent call last):
  File "~/webdev/djangoapps/django-vitae/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "~/webdev/djangoapps/django-vitae/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 296, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: main.cv_article__old

我已经尝试在测试函数中添加super(ArticleTestCase, cls).setUpTestData()并创建关系,这似乎不应该使用setUpTestData()完成。但我把它作为一个实验,它抛出了同样的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-27 22:18:03

我发现问题不在于我的测试,而在于旧版本的Django回滚数据库事务的方式与SQLite的更新行为之间的不兼容性,正如this bug report中所记录的那样(我使用的是旧代码,并且希望在更新到新版本之前运行测试)。将Django更新到版本2.1.5解决了这个错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59459482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档