【问题标题】:Django TestCase not destroying test data after tests finish running测试完成后,Django TestCase 不会破坏测试数据
【发布时间】:2018-09-12 08:41:50
【问题描述】:

我目前正在尝试为应用程序编写我的第一个 Django 规范。但是,每次我运行测试时,我都会收到 IntegrityError: UNIQUE constraint failed: auth_user.username,因为我在上次运行测试时创建的用户现在存在于数据库中。

我的印象是 TestCase 将测试代码包含在数据库事务中,以便测试期间创建的所有数据在完成时回滚?我在这里做错了什么?

from django.test import TestCase

from django.contrib.auth.models import User
from basic.models import SavedModels

# Create your tests here.
class SavedModelsTestCase(TestCase):
    User.objects.create(username="user_001",
                        password="useruser",
                        first_name="Test",
                        last_name="User",
                        email="test_user@test.com"
                        )

    user = User.objects.filter(username="user_001")
    saved_model = SavedModels.objects.create(name="Test Model",
                                             description="A model",
                                             user=user
                                            )

    def test_saved_models(self):
        saved_model = create_saved_model()
        self.assertTrue(isinstance(saved_model, SavedModels))
        self.assertEqual(saved_model.name, "Test Model")
        self.assertEqual(saved_model.description, "A model")
        self.assertEqual(saved_model.user, user)

【问题讨论】:

    标签: python django django-tests


    【解决方案1】:

    它不是这样工作的,你需要两个名为 setup 的函数来设置所需的数据(它在测试开始时运行)你需要在这里创建你的用户和 tearDown(它在最后运行)来添加这两个代码后运行该测试后进行清理,您的代码将变成这样

    class SavedModelsTestCase(TestCase):
    
       def setUp(self):
           #create your user here
        def tearDown(self):
           # for any clenaup required none in your case
    
        def test_saved_models(self):
            saved_model = create_saved_model()
            self.assertTrue(isinstance(saved_model, SavedModels))
            self.assertEqual(saved_model.name, "Test Model")
            self.assertEqual(saved_model.description, "A model")
            self.assertEqual(saved_model.user, user)
    

    【讨论】:

    • 除非您不需要删除用户,因为每次测试后数据库都会自动刷新。在 OP 的情况下,根本没有理由定义 tearDown
    • @DanielRoseman 感谢您的评论,我实际上在考虑 unittest.TestCase
    • 完美。感谢您的快速回复!
    猜你喜欢
    • 2015-08-10
    • 2022-01-25
    • 2011-09-23
    • 2014-10-15
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多