【发布时间】: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