[英]How to mock the return value of a class's function
我在这里看到了一些与类中的模拟函数相关的文章,但似乎没有一篇文章对我遇到的这种情况有所帮助。 举个简单的例子,我的源代码有 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 .
时,这给了我以下错误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 ================================================================
我在这里做错了什么?
我可以通过对您的代码进行小幅更改来解决此问题,如下所示:
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
语法更容易模拟并定义副作用。
如果有帮助,请告诉我
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.