【问题标题】:When using Python's unittest to test an class, an strange error occurs使用Python的unittest测试一个类时,出现一个奇怪的错误
【发布时间】:2021-08-17 18:35:07
【问题描述】:

我使用unittest做了以下测试用例:

if __name__ == "__main__":
    class TestList(unittest.TestCase):
        def setUp(self):
            self.li = List(["ABC", 5.6, (3, 6)])
    
        def test_append(self):
            self.li.append(1)
            self.assertEqual(self.li, List(["ABC", 5.6, (3, 6), 1]))
    
        def test_insert(self):
            self.li.insert(1, "ABC")

这是我的List 课程(为简洁起见省略了一些方法):

class List(MutableSequence):
    def __init__(self, seq=None):
        self.seq = {} if seq is None else self._dict_from_seq(seq)

    def __getitem__(self, item):
        try:
            return self.seq[item]
        except KeyError:
            raise IndexError("list index out of range") from None

    def __setitem__(self, key, value, *, usage=None):
        if key > max(self.seq.keys()) and usage != "append":
            raise IndexError("list index out of range")
        self.seq[key] = value

    def __delitem__(self, key):
        try:
            del self.seq[key]
        except KeyError:
            raise IndexError("list index out of range") from None

    @classmethod
    def _dict_from_seq(cls, seq):
        return OrderedDict(enumerate(seq))

    def _next_available_slot(self):
        return max(self.seq) + 1

    def append(self, item):
        self.__setitem__(self._next_available_slot(), item, usage="append")

    def insert(self, index, value):
        if index > max(self.seq.keys()):
            raise IndexError("list index out of range")
        self[index] = value

当我运行unittest.main() 时,出现以下错误:

File "C:\...\AppData\Local\Programs\Python\Python38\lib\unittest\loader.py", line 34, in testFailure
    raise self._exception
  File "C:\...\AppData\Local\Programs\Python\Python38\lib\unittest\loader.py", line 169, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
AttributeError: module 'fastseq' has no attribute 'TestList'

为什么会这样?

【问题讨论】:

  • 您的代码和回溯似乎都不完整。不能像这样重现错误。例如,不清楚您在哪里以及如何运行 unittest.main() 以及 List 是什么。
  • 回溯完成。
  • 不确定如何或是否相关,但您不应向__setitem__ 添加参数。它用于实现x[...] = 分配,而不是您应该直接调用的东西。
  • 仅使用 key 和 value 参数实现 __setitem__ 被证明无法支持 append()

标签: python python-3.x unit-testing python-unittest


【解决方案1】:

我解决了这个问题。显然,loader.py 无法获得 TestList 类,因为 __name__ 不是 __main__。所以我只是将if __name__ == "__main__": 行移动到我调用unittest.main() 的位置。

【讨论】:

  • 你把__name__ == "__main__" 放在了错误的地方。应该在您致电unittest.main() 之前。
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2021-01-21
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2020-10-17
相关资源
最近更新 更多