Патч метода вне класса 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)
Другие вопросы по тегам