Pythonモックモジュールを使用して、スタブしたいメソッドのみをスタブし、他のプロパティとメソッドをそのままにするようにクラスにパッチを適用するにはどうすればよいですか?

クレンウェル

私がやりたいのは、テストしているコード内で間接的にインスタンス化されるクラス内のいくつかのメソッドをスタブ化することです。そのパッチを適用したクラスの他のすべてのプロパティとメソッドを通常どおり機能させたいのですが。

これが私が欲しいものを示す簡単なケースです(Python2.7)。(注:私の実際のユースケースでは、MyClassは、テストしているコード内で間接的にインスタンス化されるクラスです):

from mock import patch

class MyClass(object):
    def __init__(self):
        self.prop = 'prop'

    def foo(self):
        return 'foo'

    def bar(self):
        return 'bar'

    def unmocked(self):
        return 'unmocked'

patcher = patch('__main__.MyClass')
MockedClass = patcher.start()
instance = MockedClass.return_value
instance.foo.return_value = 'mocked foo!'
instance.bar.return_value = 'mocked bar!'

my_instance = MyClass()
assert my_instance.foo() == 'mocked foo!', my_instance.foo()
assert my_instance.bar() == 'mocked bar!', my_instance.bar()

# These asserts fail
assert my_instance.unmocked() == 'unmocked', my_instance.unmocked()
assert my_instance.prop == 'prop', my_instance.prop

patcher.stop()

結果:

$ python mock_test.py
Traceback (most recent call last):
  File "mock_test.py", line 27, in <module>
    assert my_instance.unmocked() == 'unmocked', my_instance.unmocked()
AssertionError: <MagicMock name='MyClass().unmocked()' id='140400215338448'>

unmockedメソッドがMagicMockオブジェクトを返すようになったのはなぜですか?このクラスにパッチを適用して、必要なメソッドのみをスタブし、他のすべてをそのままにしておくにはどうすればよいですか?

シメオンヴィッサー

以下を使用してクラスにパッチを適用する必要がありますpatch.multiple

import mock

patcher = mock.patch.multiple(
    '__main__.MyClass',
    foo=mock.Mock(return_value='mocked foo!'),
    bar=mock.Mock(return_value='bar')
)

上記のコードでコードを更新すると、コードが実行され、すべてのアサーションが渡されます。完全に機能する例を次に示します。

from mock import patch, Mock

class MyClass(object):
    def __init__(self):
        self.prop = 'prop'

    def foo(self):
        return 'foo'

    def bar(self):
        return 'bar'

    def unmocked(self):
        return 'unmocked'

patcher = patch.multiple('__main__.MyClass',
                         foo=Mock(return_value='mocked foo!'),
                         bar=Mock(return_value='mocked bar!'))
patcher.start()

my_instance = MyClass()
assert my_instance.foo() == 'mocked foo!', my_instance.foo()
assert my_instance.bar() == 'mocked bar!', my_instance.bar()
assert my_instance.unmocked() == 'unmocked', my_instance.unmocked()
assert my_instance.prop == 'prop', my_instance.prop

patcher.stop()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ