我如何测试我正确地调用pickle.dump()?

时间:2017-06-17 17:32:58

标签: 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)

我可以设置测试以确保调用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并确保在某个时候使用正确的名称调用它吗?

1 个答案:

答案 0 :(得分:2)

Patch open()并从中返回可写StringIO的实例。从StringIO加载pickle数据并测试其结构和值(测试它等同于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)