【问题标题】:How to mock the return value of a class's function如何模拟类函数的返回值
【发布时间】:2021-07-02 17:55:39
【问题描述】:

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

myclass.py

class ProductionClass:

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

main.py

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 ================================================================

我在这里做错了什么?

【问题讨论】:

    标签: python unit-testing mocking


    【解决方案1】:

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

    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 语法更容易模拟和定义副作用。

    如果有帮助请告诉我

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 2020-04-06
        • 2019-06-15
        • 2017-10-17
        • 2022-01-23
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        相关资源
        最近更新 更多