Let's say I have a function like this:
def do_something(dict_obj):
# access to the dict_obj then do some stuff
eg.
if dict_obj['doors']:
do_something_with_doors()
map_car_make(dict_obj['make'])
...
if dict_obj['is_active']:
do_something_else()
I want to mock the dict_obj
to have is_active
element and don't care the rest, how do I do that?
If you want to mock an object for the duration of your entire test function, you can use patch() as a function decorator. These functions are now in their own file, separate from their tests. Next, you'll re-create your tests in a file called tests.py .
mock is a library for testing in Python. It allows you to replace parts of your system under test with mock objects and make assertions about how they have been used. unittest. mock provides a core Mock class removing the need to create a host of stubs throughout your test suite.
How to mock a dictionary in Python is a good/direct question someone else can search, so:
__getitem__
from unittest.mock import MagicMock m = MagicMock() d = {'key_1': 'value'} m.__getitem__.side_effect = d.__getitem__ # dict behaviour m['key_1'] # => 'value' m['key_2'] # => raise KeyError # mock behaviour m.foo(42) m.foo.assert_called_once_with(43) # => raise AssertionError
Related Questions:
=== EDIT ===
As a function for direct copy/pasting
def mock_dict(d): m = MagicMock() m.__getitem__.side_effect = d.__getitem__ return m
You can use this to make a mock behave like a dictionary:
mock = mocker.MagicMock() mock.__getitem__.side_effect = lambda x: getattr(mock, x)
With that code mock['some_property']
equals to mock.some_property
. This way you can still use your autogenerated Mock
s so useful for assertions, which is why I didn't like the accepted answer.
If you still need to access the methods of the dictionary then the code will need further work.
For anyone coming across this later, there is also mock.patch.dict
which can be used as a context manager, decorator, or class decorator.
For example:
from mock import patch
foo = {}
@patch.dict(foo, {"is_active": True})
def test():
assert foo['is_active'] == True
Or to mock os.environ
which is how I came across this question:
import os
from mock import patch
@patch.dict("os.environ", {"FOO": "BAR"})
def test_env():
assert os.environ['FOO'] == "BAR"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With