3

私はPythonが初めてで、特定の引数が渡された場合にのみ関数をモックしようとしています. 目的の引数以外が渡された場合は、代わりに元の関数を呼び出したいと思います。

Python 2.7 では、次のようなことを試しました。

from foo import config

def test_something(self):
    original_config = config # config is a Module.

    def side_effect(key):
        if key == 'expected_argument':
            return mocked_result
        else:
            return original_config.get(key)

        config.get = Mock(side_effect=side_effect)

        # actualy_test_something...

original_configは のコピーではないため、機能しませんconfig。無限ループに陥る同じモジュールを参照します。config代わりに元のモジュールのクローンを作成することもできますが、それはやり過ぎのようです。

私が使用できるRSpecのモックに似たものはありますか? 例えば:

obj.stub(:message).with('an_expected_argument').and_return('a_mocked_result')

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

7

最初に、パッチを適用していない関数への参照を保存する必要があります。

def test_something(self):
    original_config_get = config.get

    def side_effect(key):
        if key == 'expected_argument':
            return mocked_result
        else:
            return original_config_get(key)

        config.get = Mock(side_effect=side_effect)

ここoriginal_config_getでは、オブジェクトに置き換える前の元の関数を参照していMock()ます。

于 2014-11-30T03:35:45.720 に答える