模拟两个函数会打破循环吗?

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 是顶部装饰器但最后一个参数。