3 python unit-testing mocking pickle
我想测试这个方法:
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)
Run Code Online (Sandbox Code Playgroud)
我可以设置测试以确保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])
Run Code Online (Sandbox Code Playgroud)
不过,我不确定如何处理第二个参数。如果我为测试打开一个新文件,它将与执行时调用的文件不同。我至少想确定我打开的是正确的文件。我会嘲笑open并确保在某个时候用正确的名字调用它吗?
Patch open() and return an instance of writeable StringIO from it. Load pickled data from that StringIO and test its structure and values (test that it's equivalent to self.data). Something like this:
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)
Run Code Online (Sandbox Code Playgroud)