Утверждение импорта Python.ModuleNotFoundError: при запуске тестов и обращении к модулю в родительской папке - PullRequest
1 голос
/ 01 мая 2019

Вопрос: Как исправить оператор импорта в моем тестовом файле?

===============================================

Я запускаю следующие команды:

команды длязапустить тесты

cd cluster_health
python -m pytest tests/ -v -s

Я получаю следующую ошибку!

    ImportError while importing test module '<full path>...\cluster_health\tests\unit\test_handler.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests\unit\test_handler.py:5: in <module>
    from health_check import app
health_check\app.py:3: in <module>
    import my_elastic_search
E   ModuleNotFoundError: No module named 'my_elastic_search'

. \ cluster_health \ tests \ unit \ test_handler.py

import json
import sys
import pytest
import health_check
from health_check import app
from health_check import my_elastic_search
# from unittest.mock import patch
import mock
from mock import Mock

def test_lambda_handler(apigw_event, monkeypatch):
    CONN = Mock(return_value="banana")
    monkeypatch.setattr('health_check.my_elastic_search.connect', CONN)
    ret = app.lambda_handler(apigw_event, "")    
    # etc...

. \ cluster_health \ health_check \ app.py

import json
import sys
import my_elastic_search

def lambda_handler(event, context):
    print(my_elastic_search.connect("myhost", "myuser", "mypass"))
    # etc

. \ cluster_health \ health_check \ my_elastic_search.py

def connect(the_host, the_user, the_pass):
    return "You are connected!"

Ответы [ 2 ]

1 голос
/ 01 мая 2019

health_check - это имя папки.При импорте в Python вы не называете папку.Вы бы просто использовали import my_elastic_search.Однако это, вероятно, приведет к тому, что модуль не найден.Вы можете использовать модуль с именем 'sys', чтобы определить, где программа должна искать импортируемые модули, или вы можете поместить код в тот же каталог, что и модуль.Вы должны использовать from при импорте определенной функции из файла или класса из файла.

0 голосов
/ 01 мая 2019

Благодаря импорту модулей из родительской папки и @woofless (выше), вот мое решение проблемы (на самом деле проблема в том, что я ссылаюсь на модуль в родительском каталоге.AWS Toolkit для Visual Studio с SAM не предоставляет соответствующий код для адекватной ссылки на дополнительные родительские модули)!

Обратите внимание на sys.path.insert ниже.Кроме того, согласно @woofless, я упростила ссылку на пространство имен, чтобы она не ссылалась на корневую папку «health_check».Вуаля!

. \ Cluster_health \ tests \ unit \ test_handler.py

import sys, os, inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
parentdir = "%s\\health_check"%os.path.dirname(parentdir)
sys.path.insert(0,parentdir)
print(parentdir)

import json

import pytest
import health_check
import app
import my_elastic_search
...