代码之家  ›  专栏  ›  技术社区  ›  Ted Klein Bergman

如何测试设置和检查依赖于未测试方法的方法?

  •  2
  • Ted Klein Bergman  · 技术社区  · 7 年前

    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

    2 回复  |  直到 7 年前
        1
  •  0
  •   Andrew Morozko    7 年前

    _mask

    obj._BitMask__mask .

    允许访问私有字段是Python设计的一部分,因此使用此功能 responsibly 你自己的

        2
  •  2
  •   Evgeny    7 年前

    不确定这是否回答了您的问题,因为它涉及到初始类设计的更改,

    您创建了一个没有构造函数或属性的懒惰类,它隐藏了 set has 对象的状态未知。你吃过吗 .value self.__mask

    另外,我会在构造函数中强烈考虑一个默认值,这使得它看起来更好 is here

    def __init__(self, mask=0):
        self.__mask = mask
    

    .值

     a = BitMask(0)     
     b = BitMask(5)     
     a.set(5)
     assert a == b     
    

    当然,你可以在如何测试EQ的问题上挑战这一点。

    -A kind of x.__mask = value 对于一个小的、好的、本地定义的类(如这里的类)来说是不太合理的。