gpt4 book ai didi

python - 将函数用于模拟类的方法返回值

转载 作者:行者123 更新时间:2023-11-28 21:19:32 26 4
gpt4 key购买 nike

我是 mock 新手,并尝试使用 side_effects。

我正在尝试根据调用该方法的参数设置模拟类方法的返回值。在下面的代码中,我试图设置 some_function 的返回值。当 mock 了MyClass .

# application.py
from my_module.my_submodule import MyClass

def my_function(var1):
instance = MyClass()

instance.some_function(var1)

和我的测试文件

# test_application.py
import mock
import application

def test_my_function():
with mock.patch('application.MyClass') as MockClass:
MockClass.return_value.my_function.return_value = some_return

application.my_function(var1)

这使得 some_function 有效现在返回 some_return , 但我想用一个函数代替 some_return它采用参数 var1该函数被调用。

问题是我不知道如何定义模拟来预测 some_function 的调用参数.

我已经尝试过这篇文章中讨论的内容 changing the side effect of a mock object's method created with patch ,但我一辈子都想不出如何格式化它。

我试过这样的事情

# test_application.py
import mock
import application

def test_my_function():
with mock.patch('application.MyClass') as MockClass:
MockClass.return_value.my_function.return_value = some_return

# Breaking very long line, in my code it's actually one line.
MockDataPrep.return_value.extract_preprocessed_citizen_data.\
side_effect =\
mock.MagicMock(side_effect=my_side_effect)

application.my_function(var1)

其中函数 my_side_effect看起来像这样:

def my_side_effect(var1):
return_val = some_manipulation_of_var1(var1)

if something:
return `abc`
else:
raise LookupError

但似乎my_side_effect曾经输入过(尝试使用其中的打印语句)。我该如何格式化?

最佳答案

你在 mock 错误的方法。 my_functionapplication 模块的函数,而不是 MyClass 的方法,因此你想要模拟的是 some_function相反。

import mock
import application


def my_side_effect(*args, **kwargs):
print("my_side_effect called")
print(args, kwargs)


def test_my_function():
with mock.patch("application.MyClass") as MockClass:
MockClass.return_value.some_function.side_effect = my_side_effect

application.my_function(arg1)

这样 arg1 将被传递给 *args 中的 my_side_effect

此外,您可能只想模拟一个特定的方法,而不是整个类。

def test_my_function():
with mock.patch("application.MyClass.some_function") as mock_some_function:
mock_some_function.side_effect = my_side_effect

application.my_function(arg1)

关于python - 将函数用于模拟类的方法返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53443935/

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