Python Mocking with unitest.mock: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 83: Line 83:


===Mocking a Function of a Module===
===Mocking a Function of a Module===
Use <code>patch()</code> as a context manager.
<syntaxhighlight lang='py'>
<syntaxhighlight lang='py'>
</syntaxhighlight>
</syntaxhighlight>

Revision as of 03:45, 8 September 2022

External

Internal

Overview

The unittest.mock library allows replacing parts of the system under test with mock objects and make assertion about how they are accessed and used.

Mock

https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock

By default, a Mock accept any invocations into it.

MagicMock

Difference between Mock and MagicMock.

patch() and @patch

Sentinel

TODEPLETE

https://realpython.com/python-mock-library/

Mocking

To mock a class and a method of that class:

from unittest.mock import Mock


class SomeClass:
    def __init__(self, state):
        self.state = state

    def some_method(self):
        return self.state


sc = SomeClass('A')
assert 'A' == sc.some_method()

sc_mock = Mock(SomeClass)
sc_mock.some_method = Mock(return_value='blah')

assert 'blah' == sc_mock.some_method()


How to simulate different return values for a mocked function depending on an argument value?

Mocking a Property

https://docs.python.org/3/library/unittest.mock.html#unittest.mock.PropertyMock

Tested to work:

from unittest.mock import patch, PropertyMock

class A:
    @property
    def property_a(self):
        return "pa"

with patch('__main__.A.property_a', new_callable=PropertyMock) as mock_property:
    mock_property.return_value = 'mocked pa'
    a = A()
    assert a.property_a == 'mocked pa'

Mocking a Method

from unittest.mock import patch

class A:
    def method_a(self):
        return "ma"

with patch.object(A, 'method_a', return_value='mocked ma') as mock_method:
    a = A()
    assert a.method_a() == 'mocked ma'

Mocking a Function of a Module

Use patch() as a context manager.

Asserting Method Invocation

mock.assert_called_once_with(
  "some concrete arg 1", 
  unittest.mock.ANY)

TO further document: https://docs.python.org/3/library/unittest.mock.html#unittest.mock.ANY