私はPythonにかなり慣れておらず、現在クラスの単体テストを作成しようとしていますが、依存関係のモックアウトに問題があります。私には2つのクラスがあり、そのうちの1つ(ClassB)はもう1つのクラス(ClassC)の依存関係です。目標は、ClassCのテストケースでClassBクラスとArgumentParserクラスをモックアウトすることです。ClassBは次のようになります。
# defined in a.b.b
class ClassB:
def doStuff(self) -> None:
# do stuff
pass
def doSomethingElse(self) -> None:
# do something else
pass
クラスC:
# defined in a.b.c
from .b import ClassB
from argparse import ArgumentParser
class ClassC:
b
def __init__(self) -> None:
arguments = self.parseArguments()
self.b = ClassB()
self.b.doStuff()
def close(self) -> None:
self.b.doSomethingElse()
def parseArguments(self) -> dict:
c = ArgumentParser()
return return parser.parse_args()
そして最後に、ClassCのテストケース:
# inside a.b.test
from unittest import TestCase
from unittest.mock import patch, MagicMock
from a.b.c import ClassC
class ClassCTest(TestCase):
@patch('a.b.c.ClassB')
@patch('a.b.c.ArgumentParser')
def test__init__(self, mock_ArgumentParser, mock_ClassB):
c = ClassC()
print(isinstance(c.b, MagicMock)) # outputs False
# for reference
print(isinstance(mock_ClassB, MagicMock)) # outputs True
パッチドキュメントを読んだところ、定義されている場所ではなく、使用されている名前空間でクラスをモックすることが重要であることがわかりました。それが私がしたことです、私は嘲笑しました:abbclassBの代わりにabc .classBは、しかし両方を試しました。test__init__メソッド本体内にClassCをインポートしようとしましたが、これも機能しませんでした。私はClassBのメソッドをモックするのではなく、テストを可能な限り分離しておくためにクラス全体を好みます。
環境情報:Python 3.6.1
どんな助けでも大歓迎です!
私はPythonを初めて使用するので、クラス属性について知りませんでした。ClassBを保持するClassCのクラス属性と、クラス属性をシャドウするinitのインスタンス属性がありました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加