Патч метода вне класса Python
Я заинтересован в исправлении метода, который вызывается другим методом в одном файле. Пример - файл original.py содержит -
def A():
a = 10
b = 5
return a*b;
def B():
c = A()
return c* 10
Я хочу написать модульный тест для этого файла, скажем, назовите его test.py
import mock
import unittest
class TestOriginal(unitest.TestCase):
def test_Original_method(self):
with patch(''):
Как я могу использовать патч и макеты модулей для тестирования original.py. Я хочу, чтобы A() всегда возвращала объект MagicMock() вместо целого числа.
1 ответ
Вы просто исправляете A
глобальный в тестируемом модуле. Я бы использовал @patch
Синтаксис декоратора здесь:
import mock
import unittest
import module_under_test
class TestOriginal(unitest.TestCase):
@patch('module_under_test.A')
def test_Original_method(self, mocked_A):
mocked_A.return_value = 42
result = module_under_test.B()
mocked_A.assert_called_with()
self.assertEqual(result, 420)
Это проходит в MagicMock
макет объекта для A()
в качестве дополнительного аргумента к методу теста.
Обратите внимание, что мы явно назвали модуль здесь. Вы также можете использовать patch.object()
просто назовите атрибут модуля (который является глобальными переменными вашего модуля):
class TestOriginal(unitest.TestCase):
@patch.object(module_under_test, 'A')
def test_Original_method(self, mocked_A):
mocked_A.return_value = 42
result = module_under_test.B()
mocked_A.assert_called_with()
self.assertEqual(result, 420)
Вы все еще можете использовать with
Заявление тоже, конечно:
class TestOriginal(unitest.TestCase):
def test_Original_method(self):
with patch('module_under_test.A') as mocked_A:
mocked_A.return_value = 42
result = module_under_test.B()
mocked_A.assert_called_with()
self.assertEqual(result, 420)