Модульный тест Python заменяет класс на поддельный

#python #unit-testing #python-unittest

#python #модульное тестирование #python-unittest

Вопрос:

Я пытаюсь заменить класс поддельным классом в моем модульном тестировании Python:

 import unittest
from unittest.mock import patch
from foobar import compute_bfux

def test_compute_bfux_succeed(self):
    paramA, paramB, expected_result = 8, 11, 63

    with patch('utility.functions') as fake:
        fake = FakeUtilityFunctions()
        actual_result = compute_bfux(paramA, paramB)
    
    self.assertEqual(actual_result, expected_result)
  

В приведенном выше, FakeUtilityFunctions это реальный класс, который я написал. Я хочу поменять класс «FakeUtilityFunctions» на «utility.functions» в compute_bfux .

К сожалению, вышеописанное не работает. В compute_bfux я получаю MagicMock, а это не то, что я хочу. Я знаю, utility.functions что он заменяется MagicMock, потому что при запуске моего теста я получаю следующую ошибку…

Ошибка типа: ‘<=’ не поддерживается между экземплярами ‘MagicMock’ и ‘MagicMock’

Может ли кто-нибудь, кто видит, куда я пытаюсь пойти, сказать мне, где я это облажался?

Комментарии:

1. Я не понимаю полезности этого, нет смысла использовать подделку в функции. Не могли бы вы пояснить, почему необходима «подделка». Спасибо!

2. Неясно, что конкретно вы пытаетесь исправить и что вы пытаетесь протестировать. Откуда compute_bfux берется? Вызывает ли он служебную функцию, которую вы исправляете, или вы пытаетесь исправить это по какой-то причине?

3. @MarkMeyer test_compute_bfux_succeed тестирует функцию с именем compute_bfux . compute_bfux вызывает несколько функций в utility.functions . Для теста я хочу заменить utility.functions на поддельный. Подделка будет иметь пользовательскую реализацию функций, используемых compute_bfux .

4. @Adam fake = FakeUtilityFunctions() , как вы обнаружили, не сработает. Все, что делается, это замена ссылки в локальном имени fake . Скорее всего, вы захотите передать FakeUtilityFunctions в качестве аргумента patch , как описано здесь .

Ответ №1:

Это не работает:

 with patch('utility.functions') as fake:
    fake = FakeUtilityFunctions()
  

Вместо этого сделайте это:

 with patch('utility.functions', wraps=FakeUtilityFunctions()):
  

Комментарии:

1. Сработало как по волшебству.