Как пропатчить (дразнить) тесты с помощью Errbot?

Я пытаюсь исправить зависимости с помощью моих тестов errbot. У меня проблема в том, как errbot импортирует модули. Это не статично и ломает мои патчи-декораторы, когда я добавляю тесты или они тестируют в другом порядке.

У меня есть плагин под названием EDB (edb.py). Внутри edb.py я импортирую pyedb с import pyedb, Это находится в моем site-packages,

У меня есть тестовый файл test_edb.py, и я пытаюсь пропатчить свои тестовые методы следующим образом

pytest_plugins = ["errbot.backends.test"]
extra_plugin_dir = '.'

from unittest.mock import patch  # noqa: E402

@patch('yapsy_loaded_plugin_EDB_1.pyedb', autospec=True)
def test_edb_testlist(pyedb_mock, testbot):
    testbot.push_message('!edb testlist')

    assert "Okay, let me get..." == testbot.pop_message()
    assert "I don't see any..." == testbot.pop_message()

Errbot добавляет это yapsy_loaded_plugin_EDB_<xx> путь для импорта модуля, но xx зависит от порядка выполнения теста. Это не работает, мне нужен статический путь импорта mypath.pyedb,

Я надеюсь, что есть другой способ приблизиться к этому. Может быть, я могу изменить способ импорта модуля, чтобы он не зависел от импорта errbot?

Вот ссылка на тестирование Errbot для справки.

1 ответ

Решение

Мое решение кажется немного хакерским, но оно работает. Если у кого-то есть более элегантное решение, пожалуйста, поделитесь. Я приму свой собственный ответ через некоторое время, если не будет никаких дополнительных ответов.

Так что я сталкивался с этим раньше, но я думаю, что я все еще не был достаточно знаком с тем, как исправление работает в Python, зная, куда вносить исправления. После прочтения документации " Куда патчить" (снова:)) у меня есть обходной путь с учетом динамического импорта с помощью errbot.

Папка проекта errbot будет выглядеть

errbot-project/
├── data/
│   ├── ...
├── plugins/
│   ├── plugin1/
|       ├── ...
|   ├── plugin2/
|       ├── ...

Я заметил, что когда errbot запускает оба каталога проекта ../errbot-project и все каталоги плагинов (например, ../errbot-project/plugins/plugin1) добавляются в sys.path,

Поэтому я добавил пакет в каталог моего проекта и импортировал его в свои плагины. Затем я могу надежно исправить свои зависимости из этого пакета. Снова прочитайте документацию Where to Patch для полного объяснения почему. Это выглядит примерно так.

errbot-project/
├── data/
│   ├── ...
├── plugins/
│   ├── plugin1/
|       ├── ...
|   ├── plugin2/
|       ├── ...
├── plugin_deps/
|       ├── __init__.py

Где моя ../errbot-project/plugin_deps/__init__.py похоже

...
import dep1
import dep2
...

И тогда в моем плагине я использую

...
import plugin_deps as pdep
...
def method():
    pdep.dep1.method()
...
# note, you cannot use 
# from plugin_deps import dep1
# this changes 'where' python looks up the module and
# and 'breaks' your patch 

И, наконец, мой тестовый код выглядит

@patch('plugin_deps.dep1', autospec=True) 
def test_get_tl_tabulation(my_mock, testbot):
    # test code here
Другие вопросы по тегам