Python单元测试忽略模拟响应

时间:2019-06-12 22:15:54

标签: python mocking patch

我正在尝试为python中的自定义函数制作一个简单的模拟。此函数调出aws,并返回环境中所有实例的IP地址列表。由于我正在编写单元测试,因此我希望能够模拟该函数的响应,因此无需点击AWS即可进行测试。

我认为问题出在我使用的目标上。我已经尽力了,但是没有任何运气。

我已经尝试过使用补丁的方式:

def test_mock_ip_response(self):
    with patch("app.api.commands.ip_addresses", return_value=["10.10.10.10"]):
    results=ip_addresses("stage")
    print (results)
    assert False

并带有装饰器:

@patch("app.api.commands.ip_addresses")
def test_mock_bash_response(self, mock_ip_addresses):
    mock_ip_addresses.return_value=["10.10.10.10"]
    results=ip_addresses("stage")
    print (results)
    assert False

无论哪种方式,函数ip_addresses总是尝试调出AWS,因此该呼叫被捕获。

哦,我知道asserts设置为false,只是pytest会向我显示测试的标准输出。

更新: 包括ip_addresses的代码:

def ip_addresses(environment: str) -> List[str]:
    client = get_client("ec2")

    filters = #removed since they contain naming conventions
    response = client.describe_instances(Filters=filters)

    return [
        i["PrivateIpAddress"] for r in response["Reservations"] for i in r["Instances"]
    ]

1 个答案:

答案 0 :(得分:0)

我可以使用它了,所以请确保将答案发布在这里。这与我在测试函数中调用ip_addresses的方式有关。

代替呼叫

results=ip_addresses

我只需要将其更改为:

results=commands.ip_addresses