Skip to main content
 首页 » 编程设计

python之在 python unittest 中记录和断言一个空的模拟列表

2025年05月04日7pander-it

我正在使用 unittest 和 mock(Michael Foord 的模块)来测试一些 python 代码。

我有这样的东西(这是一个概念证明,可以更干净地重写,但我的真实代码需要像 foo 函数那样运行):

import unittest 
from mock import patch 
 
def foo(): 
    my_list = [] 
 
class Test(unittest.TestCase): 
    def test_foo(self): 
        with patch('__main__.my_list', new=[], create=True) as baz: 
            baz.extend(['foo', 'bar']) 
 
            self.assertEqual(foo(), None) 
            self.assertListEqual([], baz) 
 
if __name__ == '__main__': 
    unittest.main() 

所以问题是我的 baz 模拟对象在 foo() 调用后没有相应地改变,最后一个断言失败了。

如果我在 foo() 中使用 my_list.remove(x) 那么我可以在我的测试用例中看到更改,但我只想清空该列表,我不想遍历列表的每个元素然后删除它,不,我想要一个快速的空操作。

如何在不使用 .remove(x) 而使用函数 foo 的当前实现的情况下检查我的模拟对象是否被清空?

请您参考如下方法:

所以,我最终回答了我自己的问题......

解决方案是在 foo 中使用 my_list[:] = []。

但我也意识到传递 create=True 是不好的,因为如果该列表不存在(正是这个 POC 的情况),它将被创建并且我可能会测试损坏的代码通过测试。