我的文件夹结构
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
。任何帮助对此表示感谢!希望我的函数定义在这里很清楚,但是我很乐意包含我可能错过的任何其他信息。
非常感谢您。我已经为此花了很长时间了。希望在这里找到答案。
答案 0 :(得分:0)
我的一个好同事为我提供了解决方案,我将其发布在下面。此解决方案对我而言有效。
@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