gpt4 book ai didi

python - 新类实例未被初始化

转载 作者:行者123 更新时间:2023-11-28 23:05:40 25 4
gpt4 key购买 nike

我正在编写一个程序包,并像一个优秀的小程序员一样进行测试,但这是发生的事情:

class TestOne(unittest.TestCase):
def setUp(self):
self.finder = Finder()

def test_default_search_parts(self):
self.assertEqual(self.finder.search_parts, [])

class TestTwo(unittest.TestCase):
def setUp(self):
self.finder = Finder()

def test_add_letter(self):
self.finder.add('a')
self.assertNotEqual(self.finder.search_parts, [])

在这种情况下,test_default_search_parts 失败并返回 AssertionError: ['a'] != [],而 test_add_letter 通过。我不知道这里发生了什么。当我重写 test_default_search_parts 时,它变得非常奇怪:

def test_default_search_parts(self):
f = Finder()
self.assertEqual(f.search_parts, [])

出现同样的故障。我在这里初始化实例时做错了什么?

哦,如果这很重要的话,我正在使用 Nose 来运行它们。

最佳答案

正如@samplebias 提到的,共享状态,在这种情况下具有类级属性,可能会导致问题。这是您可能遇到的情况:

import unittest

# bad implementation of Finder, class-level attribute
class Finder(object):
search_parts = []

def add(self, letter):
self.search_parts.append(letter)


# using 'Zne' here makes sure this test is run second
class TestZne(unittest.TestCase):
def setUp(self):
print 'I am run next'
self.finder = Finder()

def test_default_search_parts(self):
self.assertEqual(self.finder.search_parts, [])


class TestTwo(unittest.TestCase):
def setUp(self):
print 'I am run first'
self.finder = Finder()

def test_add_letter(self):
self.finder.add('a')
self.assertNotEqual(self.finder.search_parts, [])

unittest.main()

输出

Traceback (most recent call last):
File "test.py", line 18, in test_default_search_parts
self.assertEqual(self.finder.search_parts, [])
AssertionError: Lists differ: ['a'] != []

问题是所有 Finder 实例都共享这个类级属性 search_parts,并且 add_letter 在默认搜索测试之前运行。

要解决,请使用类似的东西:

class Finder(object):
def __init__(self):
self.search_parts = []

这将确保它只是一个实例属性。

关于python - 新类实例未被初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5808300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com