2

我正在使用unittestand 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)infoo()那么我可以看到我的测试用例中的更改,但我只想清空该列表,我不想通过列表的每个元素然后将其删除,不,我想要一个快速的清空操作。

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

4

1 回答 1

1

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

解决方案是my_list[:] = []foo.

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

于 2012-04-26T15:39:23.103 回答