DEV Community

Kenichiro Nakamura
Kenichiro Nakamura

Posted on

python: Mock variations

This is my note on how to create various mocks. Please let me know if you have trouble creating a mock in your test.

import pytest
from unittest.mock import Mock

# Create a mock with one attribute.
def test_mock_with_one_attribute():
    mock = Mock(one_attribute='one')
    assert "one" == mock.one_attribute

# Create a mock with multiple attributes.
def test_mock_with_multiple_attributes():
    mock = Mock(**{"one_attribute":"one","two_attribute":"two"})
    assert "one" == mock.one_attribute
    assert "two" == mock.two_attribute

# Create a mock with name attribute. As name is an argument of Mock, 
# we need to speficy it after create mock object.
def test_mock_name_attribute():
    mock = Mock()
    mock.name = "ken"
    assert "ken" == mock.name

# Set return value when the mock itself is called as function.
def test_mock_as_function():
    mock = Mock(return_value='result')
    assert "result" == mock()

# Create a mock with one method.
def test_mock_with_one_method():
    mock = Mock(**{"my_method.return_value":"result"})
    assert "result" == mock.my_method()

# Create a mock with several methods and attributes at once.
def test_mock_with_methods_and_attributes():
    mock = Mock(**{"my_method.return_value":"result_my",
                   "another_method.return_value":"result_another",
                   "one_attribute":"one",
                   "two_attribute":"two"})
    assert "result_my" == mock.my_method()
    assert "result_another" == mock.another_method()
    assert "one" == mock.one_attribute
    assert "two" == mock.two_attribute

# Create a method that returns Exception.
def test_mock_with_side_effect_exception():
    mock = Mock(side_effect=Exception("dummy"))
    with pytest.raises(Exception) as e:
        mock()
    assert "dummy" == str(e.value)

# Create a mock and inner mock as it's attribute
def test_mock_with_innter_mock_multiple_attributes():
    mock = Mock(data = Mock(**{"one_attribute":"one","two_attribute":"two"}))
    assert "one" == mock.data.one_attribute
    assert "two" == mock.data.two_attribute
Enter fullscreen mode Exit fullscreen mode

Top comments (0)