I'm new to Python unit testing, and I want to mock calls to the boto3 3rd party library. Here's my stripped down code:
real_code.py:
import boto3def temp_get_variable(var_name):return boto3.client('ssm').get_parameter(Name=var_name)['Parameter']['Value']
test_real_code.py:
import unittest
from datetime import datetime
from unittest.mock import patchimport real_codeclass TestRealCode(unittest.TestCase):@patch('patching_config.boto3.client')def test_get_variable(self, mock_boto_client):response = {'Parameter': {'Name': 'MyTestParameterName','Type': 'String','Value': 'myValue','Version': 123,'Selector': 'asdf','SourceResult': 'asdf','LastModifiedDate': datetime(2019, 7, 16),'ARN': 'asdf'}}mock_boto_client.get_variable.return_value = responseresult_value = real_code.get_variable("MyTestParameterName")self.assertEqual("myValue", result_value)
When I run it the test fails with
Expected :myValue
Actual :<MagicMock name='client().get_parameter().__getitem__().__getitem__()' id='2040071816528'>
What am I doing wrong? I thought by setting mock_boto_client.get_variable.return_value = response
it would mock out the call and return my canned response instead. I don't understand why I am getting a MagicMock object instead of the return value I tried to set. I'd like to set up my test so that when the call to get_parameter
is made with specific parameters, the mock returns the canned response I specified in the test.