2012-04-25 34 views
2

我使用unittestmock(Michael Foord的模塊)來測試一些python代碼。在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() 

所以問題是,我bazfoo()調用和最後一個斷言失敗後,模擬對象不會相應地改變。

如果我使用foo()my_list.remove(x)那麼我可以看到在我的測試情況的​​變化,但我只是想清空該名單,我不想通過列表中的每個元素,然後將其刪除,不,我想要快速的空操作。

如何在不使用.remove(x)的情況下檢查我的模擬對象是否被清空,但是使用當前函數foo的實現?

回答

1

所以,我最終回答我的問題...

的解決辦法是在foo使用my_list[:] = []

但我也意識到,通過create=True是不好的,因爲如果該列表不存在(正是這個POC的情況)它將被創建,我可能會測試通過測試的代碼。