我在api/controllers/orders.py文件中有一种方法,比如api/controllers/orders.py。该方法不是任何类的一部分。
现在,我有了一个新的文件,比如api/controllers/dispatchers.py,在这里我需要知道选择了哪个仓库。我从这个文件中调用_select_warehouse_for_order来获取这个信息。
现在,在我的测试用例中,我像这样修补_select_warehouse_for_order
from unittest.mock import patch, call
def test_delivery_assignment(self, app_context):
with patch('api.controllers.orders._select_warehouse_for_order') as mock_selected_wh:
mock_selected_wh.return_value = {}
app_context.client.set_url_prefix('/v2')
response = app_context.client.get('/delivery/dispatch')
assert response.status_code == 200我面临的问题是我的补丁程序没有返回空字典。当我开始调试时,我注意到它执行了_select_warehouse_for_order中的实际代码。我是不是漏掉了什么?
更新:下面是dispatchers.py中的代码
from api.controllers.orders import _select_warehouse_for_order
@bp.route("/dispatch")
@login_required
def dispatch():
warehouses = _select_warehouse_for_order(request=request)
if len(warehouses) == 0:
logger.info("No warehouse selected")
return
logger.info("Selected warehouse: %s", warehouses[0].name)
# return response发布于 2022-09-12 18:36:08
必须在使用方法的位置进行修补,而不是在声明方法的位置进行修补。在您的示例中,您正在修补'api.controllers.orders._select_warehouse_for_order',该方法就是在这里声明的。相反,修补程序'dispatchers._select_warehouse_for_order' (可能以包含dispatchers的任何包作为前缀)。
之所以这么做是因为当你
from api.controllers.orders import _select_warehouse_for_order您可以在_select_warehouse_for_order中声明一个名称dispatchers.py,该名称引用在api/controllers/orders.py中声明的函数。实际上,您已经创建了对函数的第二个引用。现在当你打电话
warehouses = _select_warehouse_for_order(request=request)您使用的是dispatchers.py中的引用,而不是api/controllers/orders.py中的引用。因此,为了用补丁替换这个函数,您必须使用dispatchers._select_warehouse_for_order。
注意import在python中与Java中的不同之处,因为我们创建了一个新的名称,并将其分配给现有的函数或类。另一方面,当代码中提到类时,Java导入会告诉编译器在哪里查找类。
https://stackoverflow.com/questions/73693573
复制相似问题