首页 > 解决方案 > 在 Python 中使用输入参数模拟嵌套函数

问题描述

我的文件夹结构

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. 无论我尝试多少,返回的列表总是空的。但理想情况下,根据我的函数定义,返回的列表应该有一个字典,其名称与响应对象中的名称匹配。

我对Python 中的概念Mock非常陌生。patch在阅读了关于 SO 的各种帖子和 上的实际文档之后Mock,我可以走到这一步。我认为我api_mock的功能没有被利用column_api。我认为这就是问题所在,但我不确定如何column_api识别api_mock。非常感谢您对此的任何帮助!希望我的函数定义在这里很清楚,但我很高兴包含我可能错过的任何其他信息。

非常感谢你。很长一段时间以来,我一直在为此烦恼。希望能在这里找到一些答案。

标签: python-3.xunit-testingmockingpatch

解决方案


我的一位好同事帮助我解决了这个问题,我将其发布在下面。该解决方案适用于我的目的。

@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

推荐阅读