Как имитировать функцию, вызываемую объектом класса?

#python #unit-testing #python-mock

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

Вопрос:

Я начну с признания, что я только что попал в python mock или любой другой макет, если уж на то пошло, на день или два.

Итак, у меня есть файл python, в котором есть класс:

MyFileA.py

 class A:
    def Afunc():
        #do smthn
  

Теперь я хочу смоделировать другой скрипт, который использует это MyFileA.py

MyFileB.py

 from MyFileA import A

def Bfunc():
    Aobj = A()
    ReturnVal = Aobj.Afunc()
  

Как мне имитировать оператор Aobj.Afunc() , чтобы вернуть определенное значение?

Кроме того, я использую декораторы исключительно для метода mock, поэтому я ожидаю решения только в этом формате.

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

1. «ожидание»? Как насчет «желать»?

2. @mock.patch('MyFileB.A.Afunc', return_value=42) должно сработать.

Ответ №1:

Вы можете использовать mock.patch для смоделирования класса A и Afunc и его возвращаемого значения.

Например.

MyFileA.py :

 class A:
    def Afunc():
        print('do smthn')
  

MyFileB.py :

 from MyFileA import A


def Bfunc():
    Aobj = A()
    ReturnVal = Aobj.Afunc()
    return ReturnVal
  

test_MyFileB.py :

 import unittest
from MyFileB import Bfunc
from unittest import mock


class TestMyFileB(unittest.TestCase):
    @mock.patch('MyFileB.A')
    def test_Bfunc(self, mock_A):
        a_instance = mock_A.return_value
        a_instance.Afunc.return_value = "mocked value"
        actual = Bfunc()
        self.assertEqual(actual, 'mocked value')
        mock_A.assert_called_once()
        a_instance.Afunc.assert_called_once()


if __name__ == '__main__':
    unittest.main()
  

результат модульного теста с отчетом о покрытии:

 .
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
Name                                         Stmts   Miss  Cover   Missing
--------------------------------------------------------------------------
src/stackoverflow/63429593/MyFileA.py            3      1    67%   3
src/stackoverflow/63429593/MyFileB.py            5      0   100%
src/stackoverflow/63429593/test_MyFileB.py      13      0   100%
--------------------------------------------------------------------------
TOTAL                                           21      1    95%