Почему эти методы тестирования могут выполняться только в отдельных классах?

#python #unit-testing #testing #mocking

#python #модульное тестирование #тестирование #издевательство

Вопрос:

Есть очень простая вещь для тестирования в файле с именем gui.py:

     def getInputs():
        a = int(input("Enter Liters : "))
        b = int(input("Enter Persons: "))
 

Типичные вещи, такие как положительные числа, отсутствие символов и т.д.
Теперь есть тестовые примеры, которые выполняются, например:

 import gui      # The code to test
import unittest   # The test framework
from unittest.mock import patch

class Test_guiInputs1(unittest.TestCase):
       
    @patch('builtins.input')
    
    def test_getInputs1(self, mock_input):
        mock_input.side_effect = [20, 2]
        tuple = (20, 2)
        self.assertEqual(gui.getInputs(), tuple)

class Test_guiInputs2(unittest.TestCase):
    
    @patch('builtins.input')
    
    def test_getInputs(self, mock_input):
        mock_input.side_effect = [-20, 2]
        tuple = (-20, 2)
        self.assertEqual(gui.getInputs(), tuple)
 

Теперь есть 2 класса с 1 методом, так как мне не удалось ввести второй метод в первом классе. Интересно, нужна ли макетной функции некоторая повторная инициализация или что-то еще.
Все подходы подобны этому…

 class Test_guiInputs3(unittest.TestCase):
       
    @patch('builtins.input')
    
    def test_getInputs1(self, mock_input):
        mock_input.side_effect = [-20, 2]
        tuple = (-20, 2)
        self.assertEqual(gui.getsome(), tuple)

    def test_getInputs2(self, mock_input2):
        mock_input2.side_effect = [-20, 2]
        tuple2 = (-20, 2)
        self.assertEqual(gui.getsome(), tuple2)
 

… приводит к неудачному результату теста при 2-м методе. Первый получает зеленый флаг в VSC (как и ожидалось). Второй — даже с теми же значениями из первого тестового примера.
Кто-нибудь знает, что происходит не так?
(Python 3.7.1, VSC, Windows 10 Pro в случае, если это важно для каких-либо известных ошибок, специфичных для конкретной версии.)

Комментарии:

1. Основываясь на методах тестирования, я предполагаю getInputs , что они действительно возвращаются (a, b) ?

Ответ №1:

Синтаксис декоратора применяется только к следующему определению.

 @foo
def bar():
    ...
 

эквивалентно

 def bar():
   ...

bar = foo(bar)
 

Вы украшаете только первый метод, независимо от того, сколько пробелов находится между декоратором и функцией. Вам нужно украсить оба метода.

 class Test_guiInputs3(unittest.TestCase):
       
    @patch('builtins.input')
    def test_getInputs1(self, mock_input):
        mock_input.side_effect = [-20, 2]
        tuple = (-20, 2)
        self.assertEqual(gui.getsome(), tuple)

    @patch('builtins.input')
    def test_getInputs2(self, mock_input2):
        mock_input2.side_effect = [-20, 2]
        tuple2 = (-20, 2)
        self.assertEqual(gui.getsome(), tuple2)