我创建了一个示例类(一个位掩码类),它有 4 个非常简单的函数。我还为这个类(class)创建了一个单元测试。
import unittest
class BitMask:
def __init__(self):
self.__mask = 0
def set(self, slot):
self.__mask |= (1 << slot)
def remove(self, slot):
self.__mask &= ~(1 << slot)
def has(self, slot):
return (self.__mask >> slot) & 1
def clear(self):
self.__mask = 0
class TestBitmask(unittest.TestCase):
def setUp(self):
self.bitmask = BitMask()
def test_set_on_valid_input(self):
self.bitmask.set(5)
self.assertEqual(self.bitmask.has(5), True)
def test_has_on_valid_input(self):
self.bitmask.set(5)
self.assertEqual(self.bitmask.has(5), True)
def test_remove_on_valid_input(self):
self.bitmask.set(5)
self.bitmask.remove(5)
self.assertEqual(self.bitmask.has(5), False)
def test_clear(self):
for i in range(16):
self.bitmask.set(i)
self.bitmask.clear()
for j in range(16):
with self.subTest(j=j):
self.assertEqual(self.bitmask.has(j), False)
我面临的问题是,所有这些测试都需要 set
和 has
方法来设置和检查位掩码中的值,但这些方法未经测试。在不知道其中一个正确的情况下,我无法确认另一个正确。
这个示例类并不是我第一次遇到这个问题。当我需要设置和检查类中的值/状态以测试方法时,通常会发生这种情况。
我试图找到解释这一点的资源,但不幸的是他们的例子只是 use pure functions或者更改的属性可以是 read directly 。我可以通过将方法提取为纯函数或使用返回属性 __mask
的只读属性来解决该问题。
但这是首选方法吗?如果没有,我如何测试需要使用未经测试的方法设置和/或检查的方法?
最佳答案
不确定这是否能回答您的问题,因为它涉及初始类设计的更改, 但事情就这样了。
您创建了一个没有构造函数或属性的惰性类,它隐藏了您的状态
目的。这不是未经测试的 set
或 has
方法,而是以下问题
物体的状态未知。您是否有要透露的 .value
属性
self.__mask
,这将解决测试.set()和has()的问题。
此外,我强烈考虑在构造函数中使用默认值,这使得它看起来更好 实例化并允许更轻松的测试(关于避免在 python is here 中 setter 的一些建议)。
def __init__(self, mask=0):
self.__mask = mask
如果有任何设计考虑因素阻止您拥有 .value
属性,
如果 __init__ 接受一个值,也许可以使用 __eq__ 方法。
a = BitMask(0)
b = BitMask(5)
a.set(5)
assert a == b
当然,您可以质疑 __eq__ 本身是如何测试的。
最后,也许您在修补或猴子修补方面失败了 - a
阻止被测对象内部某些内容或使其以不同方式工作的技术
(例如,在没有实际调用的情况下模仿网络响应)。使用任何用于路径追踪的库
我认为你最终仍然会执行一种某种
x.__mask = value
赋值,这
对于像这里这样的小型、漂亮且本地定义的类来说不太合理。
希望它对您正在探索的内容有所帮助。
关于python - 如何测试设置和检查依赖于未经测试的方法的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50898709/