Макет вложенной функции с входными аргументами в Python - PullRequest
0 голосов
/ 15 апреля 2019

Структура моей папки

main.py
    class Class1
        generate_columns()
        column_api()
utilities.py
    class Class2
        get_response()

Я хочу смоделировать column_api() функцию в class Class1.

Сигнатура функции выглядит следующим образом:

class Class1:
    def generate_columns():
        calls `get_response()` from `class Class2` and returns response

    def column_api(data=List[Dict]]):
        resp = self.generate_columns(data)
        for item in resp:
            if data["name"] == item["name"]:
                ret.append(item)
    return ret

Я бы хотел издеваться column_api. Вот тест, который у меня до сих пор:

def test_column_api():
    testClass = Class1()
    mock_response = [{"id":"1", "name":"test1"}]
    load_data = [{"id":"1", "name":"test1"}, {"id":"2", "name":"test2"}]
    with patch("package.main.Class1.generate_columns") as api_mock:
        api_mock.return_value = mock_response

        result = testClass.column_api(load_data)
        assert len(result) == 1

Сбой здесь AssertionError. Возвращенный список всегда пуст, независимо от того, сколько я пытаюсь. Но в идеале, согласно моему определению функции, возвращаемый список должен иметь один словарь, имя которого совпадает с именем в объекте ответа.

Я очень новичок в понятиях Mock и patch в Python. Прочитав различные посты по SO и действительные документы по Mock, я дошел до этого места. Я думаю, что мой api_mock не используется функцией column_api. Я думаю, что в этом проблема, но я не уверен, как заставить column_api распознать api_mock. Любая помощь в этом очень ценится! Надеюсь, что мои определения функций здесь ясны, но я рад включить любую другую информацию, которую я мог пропустить.

Заранее большое спасибо. Я ломал голову над этим уже довольно давно. Надеюсь найти ответ здесь.

1 Ответ

0 голосов
/ 15 апреля 2019

Мой хороший коллега помог мне с решением, и я публикую его ниже.Это решение сработало для моих целей.

@pytest.fixture
def mocked_gen_col(monkeypatch):

    def mock_gen_technical(*args, **kwargs):
        return [
            {"name": "a"},
            {"name": "b"}
        ]
    monkeypatch.setattr(Class1, "generate_columns", mock_gen_technical)

def test_technical_column_api(mocked_gen_col):
    data = [{
        "id": "1",
        "name": "a"
    }]

    list = Class1().column_api(data=data)
    assert list[0]["name"] == "a"
    assert len(list) == 1
...