Python макет патча функции в другой функции

python unit-testing testing mocking patch

34729 просмотра

2 ответа

def f1():
    return 10, True

def f2():
    num, stat = f1()
    return 2*num, stat

Как использовать макетную библиотеку python для исправления f1()и возврата собственного результата, чтобы я мог проверить f2()?

Отредактировано: что-то не так с моим тестом? Похоже, это не работает, все тесты завершились неудачей с AssertionError

from foo.bar import f2
from mock import patch

class MyTest(TestCase):

    def test_f2_1(self):
        with patch('project.module.f1') as some_func:
            some_func.return_value = (20, False)
            num, stat = f2()
            self.assertEqual((num, stat), (40, False))

   @patch('project.module.f1')
   def test_f2_2(self, some_func):
       some_func.return_value = (20, False)
       num, stat = f2()
       self.assertEqual((num, stat), (40, False))
Автор: Nam Ngo Источник Размещён: 12.11.2019 09:35

Ответы (2)


24 плюса

Решение

Первый пример предполагает, что f1 () и f2 () определены в одном модуле. Следовательно, следующее должно работать:

from foo.bar import f2
from mock import patch

class MyTest(TestCase):

    @patch('foo.bar.f1')
    def test_f2_2(self, some_func):
        some_func.return_value = (20, False)
        num, stat = f2()
        self.assertEqual((num, stat), (40, False))

Патч такой же, как импорт: @patch('foo.bar.f1')

Вот хороший ответ по этому вопросу:

http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html

Автор: Vasiliy Размещён: 15.03.2015 09:43

22 плюса

Предполагая, что вы используете эту ложную библиотеку:

def f1():
    return 10, True

def f2():
    num, stat = f1()
    return 2*num, stat

import mock

print f2()   # Unchanged f1 -> prints (20, True)

with mock.patch('__main__.f1') as MockClass:       # replace f1 with MockClass 
    MockClass.return_value = (30, True)     # Change the return value

    print f2()     # f2 with changed f1 -> prints (60, True)

Если ваш код разделен на модули, вам, вероятно, придется заменить __main__.f1путь к вашему модулю / функции.

Автор: Mariusz Jamro Размещён: 23.04.2012 09:10
Вопросы из категории :
32x32