Как смоделировать список в Python?
Например, у меня есть код, который пытается получить доступ к списку:
def some_code():
script_dir = os.path.dirname(sys.argv[0])
Мне надо издеваться sys.argv[0]
, Итак, я добавляю @patch.object
к моему тесту:
import os
import sys
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
@mock.patch.object(sys, 'argv', mock.Mock(return_value=[THIS_DIR]))
def test_mytest():
some_code()
Но это не работает. Pytest вызывает ошибку:
> script_dir = os.path.dirname(sys.argv[0])
E TypeError: 'Mock' object does not support indexing
Что я делаю неправильно?
1 ответ
Решение
Не используйте Mock
объект для замены списка, просто заменить sys.argv
с другим списком. Вы все еще можете использовать mock.patch
управлять заменой и отменой однако:
@mock.patch.object(sys, 'argv', [THIS_DIR])
Обратите внимание, что вы, вероятно, хотите передать имя файла, а не каталог (если ваш тестовый каталог не вложен в тот каталог, который вы хотите использовать).
Ваша фиктивная конфигурация заменена sys.argv
с вызываемым объектом, так что только sys.argv()
подготовил бы ваш [THIS_DIR]
список.
Демо-версия:
>>> import sys
>>> from unittest import mock
>>> sys.argv
['']
>>> with mock.patch.object(sys, 'argv', ['foo', 'bar', 'baz']):
... sys.argv
...
['foo', 'bar', 'baz']
>>> sys.argv
['']