Python 如何测试I';我调用pickle.dump()正确吗?

Python 如何测试I';我调用pickle.dump()正确吗?,python,unit-testing,mocking,pickle,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,

我想测试这个方法:

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
并确保在某个时候使用正确的名称调用它?

修补
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)

实际上,我认为这不值得测试,然后我做了尽可能多的测试,发现了两个bug……如何获得修补后的
open
在调用
data.save()
后返回的
StringIO
?还是我误解了我会在哪里做这件事?我扩展了答案。这只是一个例子,还不是一个完整的解决方案。