无法模拟函数进行测试

问题描述 投票:0回答:1

我对单元测试的模拟有点陌生。

我有一些这样的代码:

在 foo/bar/baz.py 中,我有 2 个要模拟的函数,一个调用另一个:

def function1_to_mock():
.    
.    
.

def function2_to_mock(): 
    function1_to_mock()

在 foo/bar/main.py 中,我导入其中 1 个并调用它:

from .baz import function2_to_mock

def some_function(): 
    function1_to_mock()
    .
    .
    .

我想模拟 function1_to_mock 和 function2_to_mock

在我的测试中我这样做:

def function1_to_mock(kid): 
    return MOCKED_VALUE

@pytest.fixture(autouse=True) 
def mock_dependencies(): 
    with patch(foo.bar.baz.function1_to_mock') as mock_function1_to_mock, \ 
      patch('foo.bar.main.function2_to_mock') as mock_function2_to_mock: 
        mock_function2_to_mock.return_value = {
            'this': 'that
        } 
    yield mock_function1_to_mock, mock_function2_to_mock

def test_main(mock_dependencies): 
    some_function()

当 some_function 被调用时,真正的 function1_to_mock 和 function2_to_mock 被调用,而不是我的模拟。

有人可以让我知道如何正确模拟这两个函数吗?

python unit-testing mocking
1个回答
0
投票

我修改了你的代码,但我没有使用

pytest
,而只使用了模块
unittest
。 你的
baz.py
文件已经变成(离你不远:我只添加了
print
指令):

def function1_to_mock():
    print("REAL function1")
    
def function2_to_mock():
    print("REAL function2")
    function1_to_mock()

在您的

main.py
中,我仅更改了
import
指令,如下所示:

from baz import function2_to_mock

def some_function():
    function2_to_mock()

我已经在文件夹

test.py
中创建了文件
foo/bar/test.py

from main import some_function
import unittest
from unittest.mock import patch

def f1_mock():
    print('F1_MOCKED')

def f2_mock():
    print('F2_MOCKED')

class MyTestCase(unittest.TestCase):
    def test_main(self):
        with patch('baz.function1_to_mock') as mock_function1_to_mock:
            with patch('main.function2_to_mock') as mock_function2_to_mock:
                mock_function1_to_mock.side_effect = f1_mock()
                mock_function2_to_mock.side_effect = f2_mock()
                some_function()

    def test_main_real_func(self):
        some_function()

if __name__ == '__main__':
    unittest.main()

我的系统中执行的输出如下:

F1_MOCKED
F2_MOCKED
REAL function2
REAL function1
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

之前的输出显示测试方法

test_main()
调用了模拟函数
f1_mock()
f2_mock()

在这个测试中,我使用了
side_effect
而不是
return_value

© www.soinside.com 2019 - 2024. All rights reserved.