#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%