Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 单元测试在测试用例中如何/为什么相互影响,以及如何防止这种行为?_Django_Python 3.x_Unit Testing_Django Unittest - Fatal编程技术网

Django 单元测试在测试用例中如何/为什么相互影响,以及如何防止这种行为?

Django 单元测试在测试用例中如何/为什么相互影响,以及如何防止这种行为?,django,python-3.x,unit-testing,django-unittest,Django,Python 3.x,Unit Testing,Django Unittest,我正在为一个在Python3.6/Django 2.0中开发的webapp编写测试,我遇到了以下情况: class TestFoo(TestCase): def test_a(self): obj = Foo.objects.create(a = "bar") expectation = {"a" : "bar"} self.assertEquals(obj.method_x(), expectation) def test_b(

我正在为一个在Python3.6/Django 2.0中开发的webapp编写测试,我遇到了以下情况:

class TestFoo(TestCase):
    def test_a(self):
        obj = Foo.objects.create(a = "bar")
        expectation = {"a" : "bar"}
        self.assertEquals(obj.method_x(), expectation)

    def test_b(self):
        obj = Foo.objects.create(a = "baz")
        expectation = {"a" : "baz"}
        self.assertEquals(obj.method_x(), expectation)

    def test_c(self):
        obj = Foo.objects.create(a = "bar")
        obj2 = Foo.objects.create(a = "baz")
        obj.b.add(obj2)
        expectation = {"a" : "bar", "b" : {"a": "baz"}}
        self.assertEquals(obj.method_x(), expectation)
据我所知,每个测试都是单独运行的,但当我在测试a或b旁边运行测试c时,所有测试都失败了。基本上:

  • 测试a+测试b+测试c=全部失败
  • 测试a+测试b=全部通过
  • 测试c=全部通过
  • 测试a+测试c=全部失败
  • 测试b+测试c=全部失败
我试过:

  • 删除拆卸中的所有Foo对象(如果没有发生这种情况), 这没有效果
  • 使用patch.object,但这不是我想要的行为,因为我想测试该方法是否正常工作
  • 在一个单独的课堂上进行粘贴测试,这没有效果
  • 按一定顺序运行测试(a、b、c、c、a/b),这会导致不同的失败点;如果我先运行c,它通过,然后a/b失败。如果我先运行a/b,那么c失败
  • 我不确定是什么导致了这种行为,但想解决它;我知道所有测试本身都应该通过。我一直在阅读有关模拟/修补方法的文章,但我非常确定这不是我需要的,因为我需要验证该方法我的对象返回有效数据,而不是确保它们被调用或诸如此类

    所以基本上我的问题有两个:

  • 为什么会这样
  • 我如何预防它
  • 编辑1: 断言错误回溯也很奇怪;很明显,这些值彼此不相等,但更重要的是,这些值以某种方式混淆了。 不知何故,test_a.method_x()==test_c.method_x(),但test_a.a=/=test_c.a

    方法x类似于:

    def method_x(self):
        if not self.b:
            return {"a": self.a}
        else:
            return {"a": self.a, "b":{"a":self.b.a}}
    
    class Foo(models.Model):
        A_TYPES = (
            ("bar", "Bar"),
            ("baz", "Baz")
        )
        a = models.CharFields(max_length20, choices=A_TYPES)
        b = models.ManyToManyField("self")
        c = models.IntegerField(null=True)
        d = models.BooleanField(default=False)
    
    该模型类似于:

    def method_x(self):
        if not self.b:
            return {"a": self.a}
        else:
            return {"a": self.a, "b":{"a":self.b.a}}
    
    class Foo(models.Model):
        A_TYPES = (
            ("bar", "Bar"),
            ("baz", "Baz")
        )
        a = models.CharFields(max_length20, choices=A_TYPES)
        b = models.ManyToManyField("self")
        c = models.IntegerField(null=True)
        d = models.BooleanField(default=False)
    

    这可能需要更多关于模型和测试的细节。有两种情况可能会导致这种行为(最有可能的情况是:设置默认值存储在代码中而不是数据库中,因此第一个通过设置默认值将其称为“wins”的测试),但如果没有更详细的信息,就无法确定。我不确定情况是否如此。该方法只有两个相关属性('a'和'b'),所有其他属性默认为null/default值,在这些测试中设置的唯一属性是“a”,在测试c的情况下,在属性“b”上向自身添加了多个关系。但即使这样也不相关,因为如果我做的测试d本身没有多个关系,测试将失败。我将添加模型详细信息st in case though您在扩展哪个
    TestCase
    呢?大概是Django的版本,而不是
    unittest.TestCase
    ?这是正确的,但是从我所读到的Django TestCase扩展了python测试用例,所以我认为它们的工作原理类似,您可以仅使用您在这里发布的简化代码来重现行为吗?