0

我在这里看到了一些与类中的模拟函数相关的文章,但似乎没有一个对我遇到的这种情况有所帮助。举个简单的例子,我的源代码有 2 个文件,测试有 1 个。

我的类.py

class ProductionClass:

    def my_function(self, num):
        return num + 1

主文件

from myclass import ProductionClass


def main_function():
    me = ProductionClass()
    response = me.my_function(3)
    return response


if __name__ == '__main__':
    main_function()

我试图控制返回的值ProductionClass.my_function。比如我创建了以下测试:

test_main.py

from main import main_function
from mock import patch


@patch("main.ProductionClass")
def test_main_function(mock_ProductionClass):
    expected_value = 5
    mock_ProductionClass.my_function.return_value = expected_value
    response = main_function()
    assert response == expected_value

当我运行时,这给了我以下错误pytest .

collected 1 item                                                                                                                                  

test_main.py F                                                                                                                              [100%]

==================================================================== FAILURES ====================================================================
_______________________________________________________________ test_main_function _______________________________________________________________

mock_ProductionClass = <MagicMock name='ProductionClass' id='62692896'>

    @patch("main.ProductionClass")
    def test_main_function(mock_ProductionClass):
        expected_value = 5
        mock_ProductionClass.my_function.return_value = expected_value
        response = main_function()
>       assert response == expected_value
E       AssertionError: assert <MagicMock name='ProductionClass().my_function()' id='62958320'> == 5

test_main.py:10: AssertionError
============================================================ short test summary info =============================================================
FAILED test_main.py::test_main_function - AssertionError: assert <MagicMock name='ProductionClass().my_function()' id='62958320'> == 5
=============================================================== 1 failed in 0.34s ================================================================

我在这里做错了什么?

4

2 回答 2

0

我可以通过对您的代码进行一些小的更改来解决此问题,如下所示:

from main import main_function
from mock import patch


def test_main_function():
    expected_value = 5
    with patch(
            "main.ProductionClass.my_function", return_value=expected_value
    ):
        response = main_function()

    assert response == expected_value

with patch语法更容易模拟并且定义了副作用。

请让我知道是否有帮助

于 2021-07-03T01:50:43.097 回答
0

Felix K Jose 的答案有效,我也可以通过()在我的后面添加来解决它mock_ProductionClass

from main import main_function
from mock import patch


@patch("main.ProductionClass")
def test_main_function(mock_ProductionClass):
    expected_value = 5
    mock_ProductionClass().my_function.return_value = expected_value
    response = main_function()
    assert response == expected_value
于 2021-07-27T16:14:00.377 回答