如果我很好地理解了这个问题,那么您就有一个具有类似行为的函数。
module.py
def complex_function():
first = input("First input")
second = input("Second input")
return first, second
并且您想模拟 input 内置方法。你的方法是对的,唯一要解决的问题是你必须构建 2 个模拟。每个input 实例一个。
test_module.py
import pytest
from unittest.mock import Mock, patch
from module import complex_function
input_mock_y = Mock() # First mock for first input call
input_mock_n = Mock() # Second mock for second input call
input_mock = Mock() # Combine the 2 mocks in another mock to patch the input call.
input_mock.side_effect = [input_mock_y.return_value, input_mock_n.return_value]
def test_my_complex_function():
with patch('builtins.input', input_mock) as mock_input:
result = complex_function()
assert mock_method.call_count == 2
您可能会说:好的,但我怎么知道每个输入都被正确修补了?
因此,您可以为任何输入模拟指定一些返回值,以便进行比较。
input_mock_y = Mock()
input_mock_y.return_value = "Y"
input_mock_n = Mock()
input_mock_n.return_value = "N"
input_mock = Mock()
input_mock.side_effect = [input_mock_y.return_value, input_mock_n.return_value]
def test_my_complex_function():
with patch('builtins.input', input_mock) as mock_method:
result = function()
assert mock_method.call_count == 2
assert result == ('Y', 'N')