Как использовать mock_open с pickle.load - PullRequest
0 голосов
/ 19 марта 2020

Я хочу реализовать юнит-тест для функции:

def load_pickle(path):
    with open(path, 'r') as of:
        return pickle.load(of)

Я адаптировал то, что нашел на https://nickolaskraus.org/articles/how-to-mock-the-built-in-function-open/, чтобы реализовать мой юнит-тест

import pickle
from mock import mock_open

def test_load_pickle(self):
        read_data = pickle.dumps({'a': 1, 'b': 2, 'c': 3})
        mockOpen = mock_open(read_data=read_data)
        with patch('__builtin__.open', mockOpen):
            # 'testPath' is supposed to be just a string that doesn't correspond to any real path
            obj = load_pickle('testPath')
        self.assertEqual({'a': 1, 'b': 2, 'c': 3}, obj)

Хотя он работает хорошо, когда я изменяю все параметры pickle на json, он не работает с pickle, и у меня возникает ошибка: KeyError: "(dp0\nS'a'\np1\nI1\nsS'c'\np2\nI3\nsS'b'\np3\nI2\ns."

Проблема заключается в том, что часть pickle.load не работает. Я искал в Интернете и не нашел никакого решения. Разве вы не представляете, как адаптировать мой код для использования mock_open с pickle.load? Спасибо!

PS: я использую python27 (я знаю, что это плохо, но моя компания еще не перешла на python3)

РЕДАКТИРОВАТЬ: мой полный код

import unittest
import pickle

from mock import mock_open, patch

class Class(object):
    def load_pickle(self, path):
        with open(path, 'rb') as of:
            return pickle.load(of)


class TestClass(unittest.TestCase):
    def test_load_pickle(self):
        read_data = pickle.dumps({'a': 1, 'b': 2, 'c': 3})
        mockOpen = mock_open(read_data=read_data)
        with patch('__builtin__.open', mockOpen):
            obj = Class().load_pickle('testPath')
        self.assertEqual({'a': 1, 'b': 2, 'c': 3}, obj)

Полный возврат:

Traceback (most recent call last):
  File "/home/lsoret/softwares/miniconda3/envs/py27/lib/python2.7/unittest/case.py", line 329, in run
    testMethod()
  File "/home/lsoret/code/qynapse/python/qia/tests/models/testtest.py", line 17, in test_load_pickle
    obj = Class().load_pickle('testPath')
  File "/home/lsoret/code/qynapse/python/qia/tests/models/testtest.py", line 9, in load_pickle
    return pickle.load(of)
  File "/home/lsoret/softwares/miniconda3/envs/py27/lib/python2.7/pickle.py", line 1384, in load
    return Unpickler(file).load()
  File "/home/lsoret/softwares/miniconda3/envs/py27/lib/python2.7/pickle.py", line 864, in load
    dispatch[key](self)
KeyError: "(dp0\nS'a'\np1\nI1\nsS'c'\np2\nI3\nsS'b'\np3\nI2\ns."

1 Ответ

0 голосов
/ 23 марта 2020

Нашёл!

Это была моя версия mock, которая устарела ... перешла с 2.0.0 на 3.0.5 и теперь работает нормально. Спасибо!

...