user616268
user616268

Reputation:

Access part of module from pytest

I have an issue accessing part of imported module from the pytest.

Here is branch with code referenced below: https://github.com/asvc/snapshotr/tree/develop

In particular, when running this test, it works as expected for test_correct_installation() but test_script_name_checking() fails with AttributeError.

import main as ss
import os

class TestInit:
    def test_correct_installation(self):
        assert os.path.exists(ss.snapr_path)
        assert os.path.isfile(ss.snapr_path + "/main/markup.py")
        assert os.path.isfile(ss.snapr_path + "/main/scandir.py")

    def test_script_name_checking(self):
        assert ss.ssPanel.check_script('blah') is None # Here it fails

Link to the main which is being tested

What I'm trying to do is to "extract" isolated piece of code, run it with known data and compare result to some reference. Seems like extraction part doesn't work quite well, best practises for such cases would be greatly appreciated.

Traceback: AttributeError: 'module' object has no attribute 'ssPanel'

I have tried a small hack in the test_init.py:

class dummy():
    pass

nuke = dummy()
nuke.GUI = True

But it (obviously) doesn't work as nuke.GUI is being redefined in __init__.py upon every launch.

Upvotes: 0

Views: 100

Answers (1)

ljk321
ljk321

Reputation: 16770

This is a quite complex situation. When you import main in test_init.py, it will import main/__init__.py and execute all the code. This will cause nuke being imported and also, if nuke.GUI is False, there will not be ssPanel, as you can see.

The problem is that, you can't fake a dummy nuke in the test script. It won't work. Because before the test is running, the real nuke was already imported.

My suggestion would be seperate ssPanel into another python file. Then in __init__.py we can do:

if nuke.GUI:
    from sspanel import ssPanel

And in test scripts, we can also easily import it using:

from main.sspanel import ssPanel

Upvotes: 1

Related Questions