【问题标题】:Subsequent tests fail in Django after first tests succeeds第一次测试成功后,Django 中的后续测试失败
【发布时间】:2015-01-12 14:17:14
【问题描述】:

使用以下代码时,只有第二个测试用例会通过(因为它是先执行的),其余的会失败。

models.py

from django.db import models


class Application(models.Model):
    title = models.CharField(max_length=50)
    description = models.CharField(max_length=160)
    url = models.URLField(max_length=255)

test.py

from django.test import TestCase

from application.models import Application


class ApplicationTests(TestCase):

    def setUp(self):
        testApplication = Application(
            title="Application Title",
            description="Application Description",
            url="http://www.application-url.com"
        )
        testApplication.save()

    def test_application_has_title(self):
        application = Application.objects.get(pk=1)
        self.assertEqual(application.title, "Application Title")

    def test_application_has_description(self):
        application = Application.objects.get(pk=1)
        self.assertEqual(application.description, "Application Description")

    def test_application_has_url(self):
        application = Application.objects.get(pk=1)
        self.assertEqual(application.url, "http://www.application-url.com")

对我来说,似乎在第一次测试后该对象已从数据库中删除,但这不应该发生。我对 Django 很陌生,因此非常感谢您提供任何帮助。

【问题讨论】:

    标签: python django unit-testing tdd


    【解决方案1】:

    实际上,按照设计,每个测试都设计为独立运行,因此每次测试后都会重新初始化数据库;我不知道是否存在某些数据库每次使用不同 PK 的问题,但无论哪种情况,我都建议将 .get(pk=1) 与 .all()[0]

    交换

    【讨论】:

    • 这样做似乎可以使前两个测试工作,但最后一个测试 test_application_has_url() 仍然失败。 “DoesNotExist:应用程序匹配查询不存在。”
    • 如果你注释掉前两个测试(或者只是重命名,所以它们不以 test 开头),第三个有用吗?
    【解决方案2】:

    可能是testApplication 的 pk 不为 1,您可以尝试以下方法:

    class ApplicationTests(TestCase):
    
        def setUp(self):
            self.testApplication = Application.objects.create(
                title="Application Title",
                description="Application Description",
                url="http://www.application-url.com"
            )
    
        def test_application_has_url(self):
            application = Application.objects.get(pk=self.testApplication.id)
            self.assertEqual(application.url, "http://www.application-url.com")
    

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多