Как смоделировать список в 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
['']
Другие вопросы по тегам