使用python的模拟patch.object更改另一个方法内调用的方法的返回值 [英] Using python's mock patch.object to change the return value of a method called within another method

查看:134
本文介绍了使用python的模拟patch.object更改另一个方法内调用的方法的返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Is it possible to mock a return value of a function called within another function I am trying to test? I would like the mocked method (which will be called in many methods I'm testing) to returned my specified variables each time it is called. For example:

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

在单元测试中,我想使用模拟更改uses_some_other_method()的返回值,以便在Foo中每次调用它时,它将返回我在@patch.object(...)

In the unit test, I would like to use mock to change the return value of uses_some_other_method() so that any time it is called in Foo, it will return what I defined in @patch.object(...)

推荐答案

您可以通过两种方式执行此操作;带有patch和patch.object

There are two ways you can do this; with patch and with patch.object

补丁程序假设您不是直接导入对象,而是正由您正在测试的对象使用它,如下所示

Patch assumes that you are not directly importing the object but that it is being used by the object you are testing as in the following

#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:

If you are directly importing the module to be tested, you can use patch.object as follows:

#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都将被模拟".

In both cases some_fn will be 'un-mocked' after the test function is complete.

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

In order to mock multiple functions, just add more decorators to the function and add arguments to take in the extra parameters

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

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

Note that the closer the decorator is to the function definition, the earlier it is in the parameter list.

这篇关于使用python的模拟patch.object更改另一个方法内调用的方法的返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆