如何解决Python Mock Patch 两个相似的函数
假设我有一个有两个相似函数调用的函数:
def foo():
test = one_func("SELECT * from Users;")
test1 = one_func("SELECT * from Addresses;")
return test,test1
我如何修补这些功能内容中的每一个?这是我的尝试:
@patch('one_func')
def test_foo(self,mock_one_func):
mock_one_func.return_value = one_func("SELECT * from TestUsers;")
mock_one_func.return_value = one_func("SELECT * from TestAddresses;")
但我认为这个方法对每个函数的 one_func
进行整体修补。结果是:
def foo():
test = one_func("SELECT * from TestUsers;")
test1 = one_func("SELECT * from TestUsers;")
return test,test1
然后在下一行
def foo():
test = one_func("SELECT * from TestAddresses;")
test1 = one_func("SELECT * from TestAddresses;")
return test,test1
我想在补丁函数中发生的事情是。
def foo():
test = one_func("SELECT * from TestUsers;")
test1 = one_func("SELECT * from TestAddresses;")
return test,test1
解决方法
实现您所需要的方法是使用 side_effect
而不是 return_value
。 side_effect
可以是很多东西。如果它是一个 Exception
类或对象,它会在调用修补方法时引发该异常。如果是值列表,则为每个方法调用依次返回每个值。如果它是一个函数,将使用每个模拟方法调用的参数执行该函数。
这是一个工作示例,我将向您展示如何在 side_effect
和 side_effect
函数上使用值列表。使用函数的好处在于,您可以根据修补方法调用的参数使其返回特定值。
from mock import patch
import unittest
class MyClass(object):
def one_func(self,query):
return ''
def foo(self):
test = self.one_func("SELECT * from Users;")
test1 = self.one_func("SELECT * from Addresses;")
return test,test1
class Test(unittest.TestCase):
@patch.object(MyClass,'one_func')
def test_foo(self,one_func_mock):
# side_effect can be a list of responses that will be returned in
# subsequent calls
one_func_mock.side_effect = ['users','addresses']
self.assertEqual(('users','addresses'),MyClass().foo())
# side_effect can also be a method which will return different mock
# responses depending on args:
def side_effect(args):
if args == "SELECT * from Users;":
return 'other users'
if args == "SELECT * from Addresses;":
return 'other addresses'
one_func_mock.side_effect = side_effect
self.assertEqual(('other users','other addresses'),MyClass().foo())
unittest.main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。