gpt4 book ai didi

Python 单元测试补丁未按预期工作

转载 作者:行者123 更新时间:2023-12-05 05:45:33 26 4
gpt4 key购买 nike

我有以下项目结构:

root/
|-mylib/
|-tests/
| |-__init__.py
| |-test_trend.py
|-__init__.py
|-data.py
|-trend.py

trend.py 中:

from mylib.data import get_item

def get_trend(input: str):
item = get_item(input)
return f"Trend is: {item}"

data.py 中:

def get_item(id):
print("ORIGINAL")
return get_item_from_db(id)

测试

我想单独测试 get_trend,因此我在 test_trend.py 中修补了 get_item:

import unittest
from unittest.mock import patch
from mylib.trend import get_trend

def p__get_item(input):
return 0

class MyTestCase(unittest.TestCase):
@patch("mylib.data.get_item", new=p__get_item)
def test_trend(self):
v = get_trend()
self.assertEqual(v, "Trend is: 0")

但是当我运行测试时(命令从 root 目录中运行):

python -m unittest discover

我看到日志显示调用了原始的 get_item。测试当然失败了。

我做错了什么?


尝试 1

如果我尝试其他风格的补丁 APIL

class MyTestCase(unittest.TestCase):
@patch("mylib.data.get_item")
def test_trend(self, mocked_fun):
mocked_fun.return_value = 0
v = get_trend()
self.assertEqual(v, "Trend is: 0")

还是不行。在控制台日志中,我可以看到正在打印 ORIGINAL 并且测试失败。

实验一

如果我将 @patch 中的 target 更改为一个不存在的属性,例如:

@patch("mylib.data.non_existing", new=p__get_item)

我实际上从库中得到一个错误,说模块不包含这样的属性。因此,似乎 mylib.data.get_item 已被正确定位,但仍未进行修补。

最佳答案

说明

get_item 是在mylib.trend 模块中调用的,但是您在mylib.data 模块中对其进行了修补,这是错误的地方。 patch 通过替换 import 上的对象来工作。在这种情况下,您想要修补 mylib.trend 模块内的 get_item 而不是 mylib.data

解决方案

class MyTestCase(unittest.TestCase):
@patch("mylib.trend.get_item")
def test_trend(self, mocked_get_item):
mocked_get_item.return_value = 0
...

注意事项

可以在官方 python 文档中找到有关在哪里打补丁的更多说明 here .

关于Python 单元测试补丁未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71333393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com