What specific syntax must be changed below in order for a unit test running in one part of a file system to successfully test a function in a class that is located in a completely different part of a file system?
The test file is located at C:pathtosome-test-classestest_an_example.py
The class being tested is located at C:\completely\different\path\an_example.py
The problem might be in the structure of C:\completely\different\path\an_example.py
, because the C:\completely\different\path\an_example.py
IS being imported into C:pathtosome-test-classestest_an_example.py
as shown below.
Here are the details:
TEST FILE:
The test file located at C:pathtosome-test-classestest_an_example.py
is:
import unittest import subprocess #Run the tests in this file by running the following command in the terminal: #python -m unittest test_an_example.py class TestCommandBuilder(unittest.TestCase): def test_someMethod(self): import sys sys.path.insert(0, 'C:\completely\different\path\') print('sys.path is: ', str(sys.path)) import an_example print('90909090') firstString = "hello" secondString = ' there' returnBool = an_example.someMethod(firstString, secondString) self.assertTrue(returnBool) if __name__ == '__main__': unittest.main()
CLASS BEING TESTED:
The class being tested is located at C:\completely\different\path\an_example.py
and contains the following:
class an_example: def __init__(self): pass def someMethod(firstString, secondString): print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") print("firstString is: ",firstString) print("secondString is: ",secondString) combinedString = firstString+secondString print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") if combinedString == "hello there": return True else: return False
CURRENT ERROR:
Currently, the following error is being returned:
C:pathtosome-test-classes>python -m unittest test_an_example.py sys.path is: ['C:\completely\different\path\', 'C:\path\to\some-test-classes', 'C:\Users\user\AppData\Local\Programs\Python\Python310\python310.zip', 'C:\Users\user\AppData\Local\Programs\Python\Python310\DLLs', 'C:\Users\user\AppData\Local\Programs\Python\Python310\lib', 'C:\Users\user\AppData\Local\Programs\Python\Python310', 'C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages'] 90909090 E ====================================================================== ERROR: test_someMethod (test_an_example.TestCommandBuilder) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:pathtosome-test-classestest_an_example.py", line 62, in test_someMethod returnBool = an_example.someMethod(firstString, secondString) AttributeError: module 'an_example' has no attribute 'someMethod' ---------------------------------------------------------------------- Ran 1 test in 0.006s FAILED (errors=1)
As you can see from the results of the print(...)
commands in the above, the class an_example
IS being loaded into test_an_example.py
, but the someMethod(firstString, secondString)
member of the an_example
class is NOT being found.
Advertisement
Answer
Your code works fine. The issue is that you never import the an_example
class. In your test file you import an_example
but you are importing the module. You can actually see it in the traceback:
AttributeError: module ‘an_example’ has no attribute ‘someMethod’
In order to import the class an_example
you would need to do something like this:
def test_someMethod(self): import sys sys.path.insert(0, 'C:\completely\different\path\') print('sys.path is: ', str(sys.path)) # import an_example # remove this from an_example import an_example # changed this print('90909090') firstString = "hello" secondString = ' there' returnBool = an_example.someMethod(firstString, secondString) self.assertTrue(returnBool)