Я пытаюсь протестировать метод, который требует использования json.load
в Python 3.6.И после нескольких попыток я попытался запустить тест «нормально» (с обычным unittest.main () из CLI) и в iPlthon REPL.
Имея следующую функцию (упрощено для целей примера)
def load_metadata(name):
with open("{}.json".format(name)) as fh:
return json.load(fh)
со следующим тестом:
class test_loading_metadata(unittest2.TestCase):
@patch('builtins.open', new_callable=mock_open(read_data='{"disabled":True}'))
def test_load_metadata_with_disabled(self, filemock):
result = load_metadata("john")
self.assertEqual(result,{"disabled":True})
filemock.assert_called_with("john.json")
Результат выполнения файла теста приводит к разрыву сердца:
TypeError: the JSON object must be str, bytes or bytearray, not 'MagicMock'
При выполнениито же самое в командной строке дает успешный результат.
Я пробовал несколькими способами (исправление с помощью with
, как декоратор), но единственное, о чем я могу думать, это unittest
сама библиотека, и что бы она ни делала, чтобы мешать mock и patch.
Также проверил версии python в virtualenv и ipython, версии библиотеки json
.
Я бы хотелзнать, почему то, что выглядит как один и тот же код, работает в одном месте и не работает в другом.Или, по крайней мере, указатель в правильном направлении, чтобы понять, почему это может происходить.