模拟两个函数会打破循环吗?
Mocking two functions breaks the loop?
我正在尝试通过模拟其中的另外两个函数来测试我的函数:
我的代码如下:
import random
def generate_numbers():
res = []
for i in range(3):
res.append(random.randint(1,10))
return res
def my_func():
numbers = generate_numbers()
import pdb
pdb.set_trace()
for number in numbers:
print(number)
pdb.set_trace()
if number == 3:
empty_function(number)
if number == 9:
empty_function(number)
return None
def empty_function(number):
print('test')
而我的测试是这样的:
from unittest.mock import patch
from func import my_func
@patch('func.generate_numbers')
@patch('func.empty_function')
def test_my_func(mock_numbers, mock_empty_function):
mock_numbers.return_value = [2, 3, 2]
my_func()
mock_empty_function.assert_called_once()
我遇到的问题是,当我只是模拟生成数字函数时,一切都按预期工作。但后来我决定我要断言函数 empty_function 是否被调用,这就是问题所在。因为我模拟了函数,循环似乎没有进入,无论我模拟什么数字 generate_numbers,断言总是通过,这显然是错误的。
这里有谁可以看看这个并帮助我吗?
对于多个补丁,它遵循堆叠方法。参数声明遵循自下而上的装饰器映射。
参考:https://docs.python.org/3/library/unittest.mock.html#nesting-patch-decorators
因此,正确的代码变为。
from unittest.mock import patch
from func import my_func
@patch('func.empty_function')
@patch('func.generate_numbers')
def test_my_func(mock_numbers, mock_empty_function):
mock_numbers.return_value = [2,3,2]
my_func()
mock_empty_function.assert_called_once()
注意 empty_function 是顶部装饰器但最后一个参数。
我正在尝试通过模拟其中的另外两个函数来测试我的函数: 我的代码如下:
import random
def generate_numbers():
res = []
for i in range(3):
res.append(random.randint(1,10))
return res
def my_func():
numbers = generate_numbers()
import pdb
pdb.set_trace()
for number in numbers:
print(number)
pdb.set_trace()
if number == 3:
empty_function(number)
if number == 9:
empty_function(number)
return None
def empty_function(number):
print('test')
而我的测试是这样的:
from unittest.mock import patch
from func import my_func
@patch('func.generate_numbers')
@patch('func.empty_function')
def test_my_func(mock_numbers, mock_empty_function):
mock_numbers.return_value = [2, 3, 2]
my_func()
mock_empty_function.assert_called_once()
我遇到的问题是,当我只是模拟生成数字函数时,一切都按预期工作。但后来我决定我要断言函数 empty_function 是否被调用,这就是问题所在。因为我模拟了函数,循环似乎没有进入,无论我模拟什么数字 generate_numbers,断言总是通过,这显然是错误的。
这里有谁可以看看这个并帮助我吗?
对于多个补丁,它遵循堆叠方法。参数声明遵循自下而上的装饰器映射。
参考:https://docs.python.org/3/library/unittest.mock.html#nesting-patch-decorators
因此,正确的代码变为。
from unittest.mock import patch
from func import my_func
@patch('func.empty_function')
@patch('func.generate_numbers')
def test_my_func(mock_numbers, mock_empty_function):
mock_numbers.return_value = [2,3,2]
my_func()
mock_empty_function.assert_called_once()
注意 empty_function 是顶部装饰器但最后一个参数。