我正在使用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()
调用后没有相应地改变,并且最后一个断言失败。
如果我在my_list.remove(x)
中使用foo()
,那么我可以在我的测试用例中看到更改,但我只想清空该列表,我不想通过列表中的每个元素然后删除它,不,我想快速空操作。
如何在不使用.remove(x)
的情况下检查我的模拟对象是否已清空,但是使用函数foo
的当前实现?
答案 0 :(得分:1)
所以,我最终回答了自己的问题......
解决方案是在my_list[:] = []
中使用foo
。
但我也意识到传递create=True
是不好的,因为如果该列表不存在(完全是这个POC的情况),它将被创建,我可能会测试通过测试的破坏代码。 / p>