Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocking a module imported inside of a function

Is it possible to mock a module that's imported inside of a function?

for instance

def my_func(input):
    import something_else
    something_else.do_something(input)

I have an import inside of the function because of a circular dependency. Based on my googling I think I am SOL, but was wondering if anyone knew of way to make this possible.

I just want to verify that do_something gets called.

like image 502
aamiri Avatar asked Sep 25 '22 23:09

aamiri


1 Answers

You can use the same technique that's described in this answer. In short you can patch sys.modules dict. So your test can be:

from unittest.mock import patch, MagicMock

...

def test_call_do_something(self):
    m = MagicMock()
    with patch.dict("sys.modules", something_else=m):
        input_mock = MagicMock()
        my_func(input_mock)
        m.do_something.assert_called_with(input_mock)

You can rewrite it by patch decorator, but m should be a static instance.

like image 83
Michele d'Amico Avatar answered Oct 11 '22 16:10

Michele d'Amico