Как смоделировать объекты методами возвращаемое значение - PullRequest
3 голосов
/ 26 июня 2019

что у меня сейчас есть:

def some_method():
    some_obj = some_other_method()
    # This is what I want to mock return value of:
    some_obj.some_obj_some_method()

@patch('some_package.some_other_method')
def test_some_stuff(some_other_method_patch):
    some_other_method_patch.return_value = SomeObject()

Как я могу получить возможность установить возвращаемое значение some_obj.some_obj_some_method () в False?

Ответы [ 2 ]

1 голос
/ 26 июня 2019

patch('some_package.some_other_method') заменит функцию some_other_method на Mock. Теперь вам нужно заменить возвращаемое значение метода some_obj_some_method этого макета:

mock.return_value.some_obj_some_method.return_value = False

Полный пример:

# some_package.py

class SomeObject:
    def some_obj_some_method(self):
        raise RuntimeError()


def some_other_method():
    return SomeObject()


def some_method():
    some_obj = some_other_method()
    # This is what you want to mock return value of:
    return some_obj.some_obj_some_method()

Тест:

from unittest.mock import patch
from some_package import SomeObject, some_method

@patch('some_package.some_other_method')
def test_some_stuff(function_mock):
    function_mock.return_value.some_obj_some_method.return_value = False
    assert not some_method()

Тест пройдет как есть, поднимет RuntimeError без исправлений и провалит утверждение без строки function_mock.return_value.some_obj_some_method.return_value = False, поскольку some_method вернет только Mock, который никогда не будет False.

1 голос
/ 26 июня 2019

Вы можете использовать patch.object

import mock
import some_obj
@mock.patch.object(some_obj, "some_obj_some_method")
def test_some_stuff(mock_some_obj_some_method):
    mock_some_obj_some_method.return_value = False
...