Ich versuche zu verstehen, die verschiedenen Möglichkeiten, eine Konstante in Python mit mock.patch zu patchen. Mein Ziel ist es, eine Variable, die in meiner Test-Klasse definiert ist, als Patch-Wert für meine Konstante zu verwenden.Wie packe ich eine Konstante in Python mit einem Mock als Funktion Parameter
Ich habe diese Frage gefunden, die erklärt, wie eine Konstante patchen: How to patch a constant in python Und diese Frage, die erklärt, wie selbst in Patch verwenden: using self in python @patch decorator
Aber aus dieser zweiten Verbindung, kann ich nicht die bekommen testTwo Art und Weise (die Mock als Funktionsparameter bereitstellt)
Hier zu arbeiten ist mein vereinfachte Anwendungsfall:
mein module.py
MY_CONSTANT = 5
def get_constant():
return MY_CONSTANT
test_mymodule.py
import unittest
from unittest.mock import patch
import mymodule
class Test(unittest.TestCase):
#This works
@patch("mymodule.MY_CONSTANT", 3)
def test_get_constant_1(self):
self.assertEqual(mymodule.get_constant(), 3)
#This also works
def test_get_constant_2(self):
with patch("mymodule.MY_CONSTANT", 3):
self.assertEqual(mymodule.get_constant(), 3)
#But this doesn't
@patch("mymodule.MY_CONSTANT")
def test_get_constant_3(self, mock_MY_CONSTANT):
mock_MY_CONSTANT.return_value = 3
self.assertEqual(mymodule.get_constant(), 3)
#AssertionError: <MagicMock name='MY_CONSTANT' id='64980808'> != 3
Meine Vermutung ist shoudln't ich return_value, verwenden, da mock_MY_CONSTANT keine Funktion ist. Welches Attribut soll ich also verwenden, um den zurückgegebenen Wert zu ersetzen, wenn die Konstante aufgerufen wird?
Zuerst vielen Dank für Ihre Antwort! Ja, aber in diesem Fall bedeutet dies, dass der Wert von mymodule.MY_CONSTANT für alle folgenden Tests geändert wird. Deshalb möchte ich stattdessen patch verwenden, so dass es auf den Bereich beschränkt ist, in dem ich patche. –
Dann verwenden Sie 'mit patch():' für Ihren Fall. Was brauchst du mehr? Ich kann das Problem nicht verstehen, tut mir leid. –
In Variante # 3 bekommst du sowieso das gleiche Ergebnis wie # 2, warum willst du sowas wie # 3 Format? –