In simple words, patch()
will temporarily change the object referenced with another one (default: MagicMock object).
Don't know what a MagicMock or a mock object is? Come here for a brief explanation of the mock object.
Patch can be used in three ways:
- Context manager
- Decorator
- Straight-forward
def foo():
pass
from unittest.mock import patch
# __main__.foo is the reference of method foo
with patch('__main__.foo') as foo_mock:
foo_mock.return_value = 3
print(foo_mock())
print(foo())
from unittest.mock import patch
# __main__.foo is the reference of method foo
@patch('__main__.foo')
def fake_mock(foo_mock):
foo_mock.return_value = 3
print(foo_mock())
print(foo())
fake_mock()
from unittest.mock import patch
# __main__.foo is the reference of method foo
patcher = patch('__main__.foo')
foo_mock = patcher.start()
foo_mock.return_value = 3
print(foo_mock())
print(foo())
patcher.stop()
It's time to understand the __main__.foo of patch('__main__.foo')
from the example above.
This is where the object is looked up. More details in the official doc on [where to patch][]
I believe this is enough for most of your tests. Wanna know more about patch? Come to the advanced patch tutorial