2

Question: How do I fix the import statement in my test file?

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

I run the following commands:

commands to run up the tests

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

I then get the following error!

    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!"
Banoona
  • 1,470
  • 3
  • 18
  • 32

2 Answers2

1

health_check is the name of a folder. When importing in Python you do not name the folder. You would simply use import my_elastic_search. However, this will probably result in module not found. You can use a module called 'sys' to define where the program should search for modules being imported, or you could put the code in the same directory as the module. You would use from when importing a specific function from a file or a class from the file.

1

Thanks to importing modules from parent folder and @woofless (above) here is my solution to the problem (the problem statement really is that I am referencing a module in a parent directory. The scaffolding for the AWS Toolkit for Visual Studio with SAM does not provide the appropriate code to reference additional parent modules adequately)!

Note the sys.path.insert below. Additionally, as per @woofless I simplified my namespace reference so that it does not reference the root folder "health_check". Voila!

.\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
Banoona
  • 1,470
  • 3
  • 18
  • 32