python-3.x - 在 Python 中使用输入参数模拟嵌套函数
问题描述
我的文件夹结构
main.py
class Class1
generate_columns()
column_api()
utilities.py
class Class2
get_response()
我想column_api()
在class Class1
.
函数签名如下:
class Class1:
def generate_columns():
calls `get_response()` from `class Class2` and returns response
def column_api(data=List[Dict]]):
resp = self.generate_columns(data)
for item in resp:
if data["name"] == item["name"]:
ret.append(item)
return ret
我想嘲笑column_api
. 这是我到目前为止的测试:
def test_column_api():
testClass = Class1()
mock_response = [{"id":"1", "name":"test1"}]
load_data = [{"id":"1", "name":"test1"}, {"id":"2", "name":"test2"}]
with patch("package.main.Class1.generate_columns") as api_mock:
api_mock.return_value = mock_response
result = testClass.column_api(load_data)
assert len(result) == 1
它在这里失败,带有AssertionError
. 无论我尝试多少,返回的列表总是空的。但理想情况下,根据我的函数定义,返回的列表应该有一个字典,其名称与响应对象中的名称匹配。
我对Python 中的概念Mock
非常陌生。patch
在阅读了关于 SO 的各种帖子和 上的实际文档之后Mock
,我可以走到这一步。我认为我api_mock
的功能没有被利用column_api
。我认为这就是问题所在,但我不确定如何column_api
识别api_mock
。非常感谢您对此的任何帮助!希望我的函数定义在这里很清楚,但我很高兴包含我可能错过的任何其他信息。
非常感谢你。很长一段时间以来,我一直在为此烦恼。希望能在这里找到一些答案。
解决方案
我的一位好同事帮助我解决了这个问题,我将其发布在下面。该解决方案适用于我的目的。
@pytest.fixture
def mocked_gen_col(monkeypatch):
def mock_gen_technical(*args, **kwargs):
return [
{"name": "a"},
{"name": "b"}
]
monkeypatch.setattr(Class1, "generate_columns", mock_gen_technical)
def test_technical_column_api(mocked_gen_col):
data = [{
"id": "1",
"name": "a"
}]
list = Class1().column_api(data=data)
assert list[0]["name"] == "a"
assert len(list) == 1
推荐阅读
- azure - 我们如何在 Azure 应用程序洞察中显示数据库查询
- sql - 插入包含基于同一行的计算列的行
- mongodb - 测试容器中的 Mongo
- c# - 如何在 C# 中多次将内容从一个数据表复制到另一个数据表
- django - 没有在 django 项目上安装 requirements.txt
- ios - UIAccessibilityCustomAction 选择器不适用于静态方法
- scala - 几天后,Kafka Streams 变慢/不读取数据
- c++ - What exactly is the 'vertexPosition_modelspace' attribute
- jquery - 如何将表情符号面板添加到 Extjs 项目
- javascript - Angular动态复选框过滤实现