python - 如何测试我是否正确调用了 pickle.dump()?

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

最佳答案

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

关于python - 如何测试我是否正确调用了 pickle.dump()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44607468/

相关文章:

用于从 image-net.org 下载图像以进行 haar 级联训练的 python 代码

python - bash 等同于 os.walk?

java - InjectMocks 几次

kotlin - io.mockk.MockKException : no answer found when mocking list of objects with ObjectMapper. readValue() 使用 mockk?

c# - 在方法中模拟一个对象

python - 为什么可以在没有全局指定的情况下扩展修改值?

python - 将文本文档坐标 'x, y' 转换为浮点列表对象

unit-testing - 在 Jest 中没有调用 Mock

c# - 单元测试检索方法 - 多余?

unit-testing - Angular2 单元测试 - 为什么 nativeElement 有空的 CSSStyleDeclaration