【问题标题】:Python unit test ignoring mocked responsePython单元测试忽略模拟响应
【发布时间】:2019-10-27 11:46:23
【问题描述】:

我正在尝试为 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,所以调用没有被捕获。

哦,我知道断言设置为 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"]
    ]

【问题讨论】:

  • 向我们展示您正在测试的代码。
  • 在修补之前导入值可能有问题?如果您在patch 之后导入,或者可能只是导入模块而不是直接导入值,是否有任何变化。即results=app.api.commands.ip_addresses("stage")
  • 我清理并更新了帖子。谢谢!
  • 我现在看到了问题:你必须修补你正在使用该功能的地方,这里是你的测试模块:@patch(ip_addresses)。但是那你在测试什么?模拟?
  • @flakes 我尝试用整个路径调用它,但没有运气。只是一个未定义的错误。将导入移到patch 之后只会导致它失败。 patch 应该正在寻找现有路径的内存位置并重定向它,因此必须先调用它,然后才能调用 patch

标签: python mocking patch


【解决方案1】:

我得到了它的工作,所以我会确保在这里发布答案。这与我在测试函数中调用ip_addresses 的方式有关。

而不是调用

results=ip_addresses

我只需要将其更改为:

results=commands.ip_addresses

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2021-05-01
    • 1970-01-01
    • 2016-03-01
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多