如何在函数中模拟函数。是否可以使用两个或多个补丁来模拟函数内的函数调用?
How to mock a function within a Function. Is it possible to use two or more Patches to mock a function call within a Function?
我需要模拟一个函数 (funk) 调用,该调用依赖于在此函数 (funk) 中调用的另外两个函数的 return 值。是否可以使用 1 个以上的 Patch 来模拟两个被调用函数的 return 值。
API 待测试/模拟:
from subprocess import check_output
def get_value_a(value_a: int):
return value_a
def get_value_b(value_b: int):
return value_b
def print_contents_of_cwd(val_a, val_b):
if val_a > 0:
return check_output(['ls']).split()
else:
return val_b
我正在尝试使用两个补丁来模拟两个函数(get_value_a
和 get_value_b
)的 return 值,如下所示:
from Mack_Test_Practise import list_dir
from unittest import mock, TestCase
class TestExamples(TestCase):
# Using Decorator Method
@mock.patch('Mack_Test_Practise.list_dir.check_output',
return_value=b'list_dir.py')
@mock.patch('Mack_Test_Practise.list_dir.get_value_a',
return_value=5)
@mock.patch('Mack_Test_Practise.list_dir.get_value_b',
return_value=3)
def test_print_contents_of_file(self, mock_check_output,val_a, val_b):
actual_result = list_dir.print_contents_of_cwd(val_a, val_b)
print("actual_result", actual_result)
expected_result = b'list_dir.py'
self.assertIn(expected_result, actual_result)
当我 运行 测试时抛出以下错误。
Error
Traceback (most recent call last):
File "/usr/lib/python3.6/unittest/mock.py", line 1183, in patched
return func(*args, **keywargs)
File
"/home/shyam/PycharmProjects/pythonProject/Mock_Test/test_list_dir.py", line 15, in test_print_contents_of_file
actual_result = list_dir.print_contents_of_cwd(val_a, val_b)
File "/home/shyam/PycharmProjects/pythonProject/Mack_Test_Practise/list_dir.py", line 13, in print_contents_of_cwd
if val_a > 0:
**TypeError: '>' not supported between instances of 'MagicMock' and 'int'**
我的第一个问题是,是否允许像我一样使用多个补丁?
我的第二个问题是为什么我们会得到类型错误,因为它是 Python.
中的合法运算符
请提出解决方案。
万分感谢和最诚挚的问候!!
像这样使用多个补丁是合法的。
我认为你的问题是因为你修补了一个函数,并试图将修补后的函数与一个整数进行比较。您在模拟中设置了 return 值,但您仍然需要调用它来获取该 return 值。
actual_result = list_dir.print_contents_of_cwd(val_a(), val_b())
请注意 val_a()
和 val_b()
中的括号
现在,由于这些不再是值,而是函数(从技术上讲,它们是 MagicMock 对象,但它们正在替换函数)我建议将它们重命名为 get_val_a()
和 get_val_b()
以便你的意图更明确了。
我需要模拟一个函数 (funk) 调用,该调用依赖于在此函数 (funk) 中调用的另外两个函数的 return 值。是否可以使用 1 个以上的 Patch 来模拟两个被调用函数的 return 值。
API 待测试/模拟:
from subprocess import check_output
def get_value_a(value_a: int):
return value_a
def get_value_b(value_b: int):
return value_b
def print_contents_of_cwd(val_a, val_b):
if val_a > 0:
return check_output(['ls']).split()
else:
return val_b
我正在尝试使用两个补丁来模拟两个函数(get_value_a
和 get_value_b
)的 return 值,如下所示:
from Mack_Test_Practise import list_dir
from unittest import mock, TestCase
class TestExamples(TestCase):
# Using Decorator Method
@mock.patch('Mack_Test_Practise.list_dir.check_output',
return_value=b'list_dir.py')
@mock.patch('Mack_Test_Practise.list_dir.get_value_a',
return_value=5)
@mock.patch('Mack_Test_Practise.list_dir.get_value_b',
return_value=3)
def test_print_contents_of_file(self, mock_check_output,val_a, val_b):
actual_result = list_dir.print_contents_of_cwd(val_a, val_b)
print("actual_result", actual_result)
expected_result = b'list_dir.py'
self.assertIn(expected_result, actual_result)
当我 运行 测试时抛出以下错误。
Error
Traceback (most recent call last):
File "/usr/lib/python3.6/unittest/mock.py", line 1183, in patched
return func(*args, **keywargs)
File
"/home/shyam/PycharmProjects/pythonProject/Mock_Test/test_list_dir.py", line 15, in test_print_contents_of_file
actual_result = list_dir.print_contents_of_cwd(val_a, val_b)
File "/home/shyam/PycharmProjects/pythonProject/Mack_Test_Practise/list_dir.py", line 13, in print_contents_of_cwd
if val_a > 0:
**TypeError: '>' not supported between instances of 'MagicMock' and 'int'**
我的第一个问题是,是否允许像我一样使用多个补丁?
我的第二个问题是为什么我们会得到类型错误,因为它是 Python.
中的合法运算符
请提出解决方案。
万分感谢和最诚挚的问候!!
像这样使用多个补丁是合法的。
我认为你的问题是因为你修补了一个函数,并试图将修补后的函数与一个整数进行比较。您在模拟中设置了 return 值,但您仍然需要调用它来获取该 return 值。
actual_result = list_dir.print_contents_of_cwd(val_a(), val_b())
请注意 val_a()
和 val_b()
现在,由于这些不再是值,而是函数(从技术上讲,它们是 MagicMock 对象,但它们正在替换函数)我建议将它们重命名为 get_val_a()
和 get_val_b()
以便你的意图更明确了。