mock.patchを使用して、Pythonで定数をパッチするさまざまな方法を理解しようとしています。 私の目標は、Testクラスで定義された変数をmy定数のパッチ値として使用できるようにすることです。モックを関数パラメータとして使用してPythonで定数をパッチする方法
Iが一定にパッチを適用する方法について説明し、この問題は検出されませんでした: How to patch a constant in python とパッチで自己の使用方法を説明し、この質問: using self in python @patch decorator
をしかし、この第二のリンクから、私はを取得することはできませんここで
を動作させる(関数のパラメータとしてモックを提供する)testTwoの方法は、私の簡素化ユースケースである:
私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
私の推測では、mock_MY_CONSTANTは関数ではないので、私は、RETURN_VALUEを使用shoudln'tです。では、定数が呼び出されたときに返される値を置き換えるために使用するはずの属性は何ですか?
まずはお返事ありがとうございます! はい、この場合、mymodule.MY_CONSTANTの値がすべての今後のテストで変更されることを意味します。だから私は代わりにパッチを使用したいので、パッチ適用範囲に制限されています。 –
そして、あなたの場合には 'with patch():'を使います。何が必要ですか?問題を理解できません、申し訳ありません。 –
#3の変種では#2と同じ結果が得られますが、なぜ#3フォーマットのようなものが欲しいのですか? –