gpt4 book ai didi

python - 使用 python 的模拟 patch.object 更改在另一个方法中调用的方法的返回值

转载 作者:IT老高 更新时间:2023-10-28 20:30:41 25 4
gpt4 key购买 nike

是否可以模拟在我尝试测试的另一个函数中调用的函数的返回值?我希望模拟方法(将在我正在测试的许多方法中调用)在每次调用时返回我指定的变量。例如:

class Foo:
def method_1():
results = uses_some_other_method()
def method_n():
results = uses_some_other_method()

在单元测试中,我想用mock来改变uses_some_other_method()的返回值,这样在Foo中任何时候调用它都会返回我在 @patch.object(...)

中定义的内容

最佳答案

有两种方法可以做到这一点;带补丁和带补丁.object

Patch 假定您不是直接导入对象,而是您正在测试的对象正在使用它,如下所示

#foo.py
def some_fn():
return 'some_fn'

class Foo(object):
def method_1(self):
return some_fn()
#bar.py
import foo
class Bar(object):
def method_2(self):
tmp = foo.Foo()
return tmp.method_1()
#test_case_1.py
import bar
from mock import patch

@patch('foo.some_fn')
def test_bar(mock_some_fn):
mock_some_fn.return_value = 'test-val-1'
tmp = bar.Bar()
assert tmp.method_2() == 'test-val-1'
mock_some_fn.return_value = 'test-val-2'
assert tmp.method_2() == 'test-val-2'

如果是直接导入要测试的模块,可以使用patch.object,如下:

#test_case_2.py
import foo
from mock import patch

@patch.object(foo, 'some_fn')
def test_foo(test_some_fn):
test_some_fn.return_value = 'test-val-1'
tmp = foo.Foo()
assert tmp.method_1() == 'test-val-1'
test_some_fn.return_value = 'test-val-2'
assert tmp.method_1() == 'test-val-2'

在这两种情况下 some_fn 都将在测试功能完成后“取消模拟”。

编辑:为了模拟多个函数,只需在函数中添加更多装饰器并添加参数以接收额外的参数

@patch.object(foo, 'some_fn')
@patch.object(foo, 'other_fn')
def test_foo(test_other_fn, test_some_fn):
...

请注意,装饰器越接近函数定义,它在参数列表中的位置就越早。

关于python - 使用 python 的模拟 patch.object 更改在另一个方法中调用的方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18191275/

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