2017-06-17 8 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

私は実際にこれがテストの価値はなかった考えていた、そして私はとにかく私ができる限りをして、2個のバグを見つけた.... – JETM

答えて

2

パッチopen()を読み込み、そこから書き込み可能なStringIOのインスタンスを返します。そのStringIOからピクルされたデータをロードし、その構造と値をテストします(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'になるだろう'open'は' data.save() 'を呼び出した後に戻りますか?それとも私はどこでそれをやっているのか誤解していますか? – JETM

+1

私は答えを広げました。これは単なる例であり、まだ完全な解決策ではありません。 – phd

関連する問題