在python unittest中记录并声明一个空的模拟列表

时间:2012-04-25 17:41:37

标签: python unit-testing mocking

我正在使用unittestmock(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()调用后没有相应地改变,并且最后一个断言失败。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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