Ложный метод в тестовом файле из другого каталога python - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь смоделировать метод и сталкиваюсь с проблемами, когда mock фактически перезаписывает его.

app / tests / test_file.py <- содержит модульный тест, в настоящее время использующий: </p>

@mock.patch('app.method', return_value='foo')
def test(self, thing):
    ...
    do some stuff with app/main/server.py 
    and get its response, assert a few values
    ...
    assert 'foo' is in return value of some stuff

Пересматриваемый метод вызывается другим файлом, который вызывает server.py.

  • app / main / server.py <- с чем на самом деле взаимодействует модульный тест </li>
  • app / main / route.py <- где вызываемый метод называется </li>
  • app / main / thing.py <- содержит метод для насмешки </li>

Это с Python 2.7, и каждый пакет имеет файл инициализации. Родительская папка (приложение) содержит импорт для каждого класса и метода. Я пробовал app.method, который не доставляет проблем, но не работает. Я пробовал thing.method, выдает ошибку. Я пробовал app.main.thing.method, который ничего не делает.

У меня был успех в этом же наборе тестов, имитирующем объект и один из его методов, но этот объект создается и используется непосредственно в файле server.py. Мне интересно, если это потому, что вызываемый метод так далеко вниз по цепочке. Насмешка для меня довольно волшебна, особенно в Python.

1 Ответ

0 голосов
/ 29 августа 2018

После того, как больше раскопок наконец-то выяснили, оставим это для любых других, у которых есть проблемы (тем более, что это не легко для Google).

Как указано @Gang, полный путь должен работать, однако модуль должен быть модулем, где вызывается метод, а не модулем, в котором он расположен, , как указывает этот человек. . Используя пример @Gang:

@mock.patch('app.main.route.method')
def test(self, mock_method):
    mock_method.return_value = 'foo'
    # call and assert
...