#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. Сработало как по волшебству.