我正在努力对正在使用的枚举的 __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)
我是一名优秀的程序员,十分优秀!