Мок-функция из другого модуля

У меня есть два файла Python:

функция.py:

def foo ():
    return 20

def func ():
    temp = foo()
    return temp

и mocking.py:

 from testing.function import *
 import unittest
 import mock
 class Testing(unittest.TestCase):

 def test_myTest(self):

     with mock.patch('function.func') as FuncMock:
         FuncMock.return_value = 'string'

         self.assertEqual('string', func())

Я хочу издеваться над func, но без положительного результата. У меня AssertionError: 'string'!= 20. Что мне делать, чтобы правильно издеваться? Если я выполню mock.patch('func'), у меня будет TypeError: Нужна действительная цель для исправления. Вы предоставили: 'func'. Если я перемещаю func в mocking.py и вызываю foo: function.foo(), он работает правильно. Но как это сделать, если я не хочу перемещать функции из function.py в mocking.py?


person sweet_sugar    schedule 04.12.2014    source источник


Ответы (1)


Имитация полезна, когда вы вызываете реальную функцию, но хотите, чтобы некоторые вызовы функций внутри этой функции были имитированы. В вашем случае вы стремитесь издеваться над func и хотите вызвать эту издевательскую функцию напрямую, выполнив func().

Однако это не сработает, потому что вы издеваетесь над function.func, но уже импортировали func в свой тестовый файл. Итак, func(), которую вы вызываете, является реальной функцией, это не то же самое, что издевательская FuncMock. Попробуйте позвонить FuncMock(), и вы получите ожидаемый результат.

Следующее должно работать, и это дает вам представление о том, что можно сделать:

from testing.function import func
import unittest
import mock

class Testing(unittest.TestCase):

    def test_myTest(self):

        with mock.patch('testing.function.foo') as FooMock:
            FooMock.return_value = 'string'

            self.assertEqual('string', func())
person Simeon Visser    schedule 04.12.2014