2017-06-17 67 views
1

我想測試這種方法:如何測試我正確調用pickle.dump()?

class Data(object): 

    def save(self, filename=''): 
     if filename: 
      self.filename = filename 
     if not self.filename: 
      raise ValueError('Please provide a path to save to') 
     with open(self.filename, 'w') as f: 
      pickle.dump(self, f) 

我可以設置測試,以確保pickle.dump被調用,並且第一個參數是對象:

@patch('pickle.dump') 
def test_pickle_called(self, dump): 
    self.data.save('foo.pkl') 
    self.assertTrue(dump.called) 
    self.assertEquals(self.data, dump.call_args[0][0]) 

我不知道盡管如此,第二個參數該怎麼做。如果我爲測試打開一個新文件,它不會與被調用執行的文件相同。我至少想確定我正在打開正確的文件。我只是嘲笑open,並確保在某些時候以正確的名稱被叫到?

+0

其實我在想,這是不值得的測試,然後我做了,就像我反正能發現兩個漏洞.... – JETM

回答

2

補丁open()並從中返回可寫入的StringIO實例。加載來自該StringIO的pickled數據並測試其結構和值(測試它相當於self.data)。事情是這樣的:

import builtins # or __builtin__ for Python 2 
builtins.open = open = Mock() 
open.return_value = sio = StringIO() 
self.data.save('foo.pkl') 
new_data = pickle.load(sio.getvalue()) 
self.assertEqual(self.data, new_data) 
+0

我怎麼會得到'StringIO'的修補我調用'data.save()'後返回'open'?或者我誤解了我該怎麼做? – JETM

+1

我擴展了答案。這僅僅是一個例子,而不是一個完整的解決方案。 – phd