Как пропатчить (дразнить) тесты с помощью 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