gpt4 book ai didi

python - 我如何对 Enum 的 __init__ 方法进行单元测试?

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:56 24 4
gpt4 key购买 nike

我正在努力对正在使用的枚举的 __init__ 方法进行单元测试。困难在于我无法扩展枚举(因此无法隐式调用 __init__)。当我尝试直接从我的测试中调用它时,它坚持认为第一个参数应该是该枚举的一个实例。我不能这样做,因为我不能提前假设枚举的任何属性。

举一个人为的问题示例,假设我有一个偶数枚举:

class EvenNumbers(Enum):
two = 2
four = 4

我想做一些值检查,这样就不会有人不小心向这个枚举添加奇数:

class EvenNumbers(Enum):
two = 2
four = 4

def __init__(self, value):
assert value % 2 == 0

现在我想编写一个测试来确保它能正常工作。两种方法看似直观但行不通:

def test_approach_1():
'''
Try to extend the Enum with a bad value. This fails
because I can't extend an Enum.
'''

class BadEnum(EvenNumbers):
three = 3

def test_approach_2():
'''
Try to call the __init__ method directly. This fails
because I need to supply an instance of the enum as
the first parameter and I can't assume any values are
available.
'''

EvenNumbers.__init__(None, 3)

我应该如何对我的 __init__ 方法进行单元测试?

最佳答案

当测试一个一次性的 Enum 时(换句话说,你只有一个限制为偶数的 Enum 类),然后只测试它枚举的值:

for enum in EvenNumbers:
self.assertTrue(enum.value % 2 == 0)

如果您有希望在许多枚举之间共享的行为,或者被测试的行为与成员的实际创建有关,那么创建一个仅包含行为(无成员)的基类:

class EvenNumbers(Enum):
def __init__(self, value):
if value % 2 ! = 0:
raise ValueError('%d is not an even number' % value)
def double(self):
return self.value * 2

然后您可以创建测试枚举:

class TestEvenEnum(unittest.TestCase):

def test_bad_value(self):
with self.assertRaises(ValueError):
class NotEven(EvenNumbers):
one = 1

def test_good_value(self):
class YesEven(EvenNumbers):
two = 2
self.assertEqual(YesEven.two.double(), 4)

关于python - 我如何对 Enum 的 __init__ 方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654919/

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