Python unit test mock, get mocked function's input arguments
Question: I want a unit test to assert that a variable `action` within a function is
getting set to its expected value, the only time this variable is used is when
it is passed in a call to a library.

    
    
    Class Monolith(object):
        def foo(self, raw_event):
            action =  # ... Parse Event
            # Middle of function
            lib.event.Event(METADATA, action)
            # Continue on to use the build event.
    

My thought was that I could mock `lib.event.Event`, and get its input
arguments and assert they are of specific value.

>Is this not how mocks work? The mock documentation frustrates me with its
inconsistency, half-examples, and plethora of examples that are not related to
what I want to do.


Answer: You could use patch decorator and then call **assert_called_with** to that
mocked object like this:

If you have this structure:

    
    
    example.py
    tests.py
    lib/__init__.py
    lib/event.py
    

And the content of **example.py** is:

    
    
    import lib
    
    METADATA = 'metadata_example'
    
    class Monolith(object):
    
        def foo(self, raw_event):
            action =  'action_example' # ... Parse Event
            # Middle of function
            lib.event.Event(METADATA, action)
            # Continue on to use the build event.
    

And the content of **lib/event.py** is:

    
    
    class Event(object):
    
        def __init__(self, metadata, action):
            pass
    

The code of **tests.py** should be like:

    
    
    import mock
    import unittest
    
    from lib.event import Event
    from example import Monolith
    
    
    class TestExample(unittest.TestCase):
    
        @mock.patch('lib.event.Event')
        def test_example1(self, event_mocked):
            # Setup
            m = Monolith()
    
            # Exercise
            m.foo('raw_event')
    
            # Verify
            event_mocked.assert_called_with('metadata_example', 'action_example')
    

