Как я могу подсмотреть возвращаемое значение внутренней функции - PullRequest
0 голосов
/ 14 мая 2018

Я провожу интеграционное тестирование, и мне интересно, как получить возвращаемое значение какой-то внутренней функции, я думал об использовании mocks, но там есть только параметры получения

пример:

def foo():
    goo()

def goo():
    return 3

def test():
    with patch(goo) as goo_mock:
        foo()
        assert goo_mock.return_value == 3

1 Ответ

0 голосов
/ 14 мая 2018

Вот ответ, который работает в python 2.7.10 и 3.6.1 в Windows

import sys

if sys.version_info[0] < 3:
    from mock import patch
else:
    from unittest.mock import patch

def foo():
    return goo()

def goo():
    return 3

class CaptureValues(object):
    def __init__(self, func):
        self.func = func
        self.return_values = []

    def __call__(self, *args, **kwargs):
        answer = self.func(*args, **kwargs)
        self.return_values.append(answer)
        return answer

def test():
    with patch('__main__.goo', CaptureValues(goo)) as goo_mock:
        x = foo()
        x = foo()
        print(goo_mock.return_values)
        assert goo_mock.return_values == [3, 3]

if __name__ == '__main__':
    test()

return_value используется, когда вы хотите, чтобы ваша функция возвращала какое-то произвольное значение, чтобы вы могли проверить другие детали. Вот goo, который требует много времени для расчета. Я уже тестировал goo где-то еще, и я действительно тестирую внутренние компоненты foo, и я не хочу ждать 5 секунд, чтобы вычислить истинный ответ, который возвращает goo. (чтобы увидеть разницу, раскомментируйте slow_test и посмотрите захватывающий отсчет)

import time
from unittest.mock import patch
def foo(x):
    return goo(x)

def goo(x):
    for sec in range(x, 0, -1):
        time.sleep(1)
        print(sec)
    return x**2

def slow_test():
    x = foo(5)
    assert x == 25

def test():
    with patch('__main__.goo') as goo_mock:
        goo_mock.return_value = 25
        x = foo('who cares')

        assert x == 25

if __name__ == '__main__':

    test()
    # slow_test()

Как правило, вы хотите использовать поддельные выражения для создания ложного ответа от вашего помощника, goo. Это делается для того, чтобы убедиться, что foo работает должным образом с конкретными ответами от goo и / или чтобы проверить, что при преобразовании данных в goo вы передаете правильные данные.

  1. тест goo
  2. тест foo:
    1. с mock_goo.assert_called_with() убедитесь, что вы передали goo правильные значения
    2. установить mock_goo.return_value для проверки foo с различными значениями, возвращаемыми из goo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...