I have the following problem:
My main.py
contains:
from google.cloud import secretmanager
secret_name = "abc"
def function_1(secret):
client = secretmanager.SecretManagerServiceClient()
name = f"projects/123/secrets/{secret}/versions/latest"
response = client.access_secret_version(name=name)
return response.payload.data.decode("UTF-8")
def function_2():
secret = function_1(secret_name)
return secret
secret = function_2()
and my test_main.py
has:
def test_function_1():
import main
...
When running this and other tests in test_main.py
I get an error because by importing main function_2
is called and e.g. the access_secret_version method is called unmocked. I don't want to change my main.py
and for example put secret = function_2()
under if __name__=="__main__"
. I want to fix this in test_main.py
.
I tried different things like
@patch('main.secretmanager.SecretManagerServiceClient')
@patch('main.secretmanager.SecretManagerServiceClient.access_secret_version')
def test_function_1():
import main
...
but import main
is always calling these methods unmocked. How can I do this? How can I mock what function_2
is calling?
Here Mock function called on import the OP found a similar workaround.
Thank you in advance for any help.
CodePudding user response:
The module in the @patch
decorator should be google.cloud
instead of main
, otherwise you're importing from main in order to patch (which runs function_2
before it's patched).
@patch('google.cloud.secretmanager.SecretManagerServiceClient')