私はPythonにはかなり新しく、現在クラスの単体テストを作成しようとしていますが、依存関係を模倣することにいくつか問題があります。私は2つのクラスを持っていますが、そのうちの1つ(ClassB)は他のクラス(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()
そして最後に、クラスCのためのテストケース:
# 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
私はそれがクラスをモックすることが重要だとパッチdocsで読みます名前空間内では、定義されていない場所で使用されます。それで私がやったことです、私は嘲笑しました:a.b.c .classBの代わりにa.b.b.classBの両方を試しました。私はまた、test__init__メソッド本体の中でClassCをインポートしようとしましたが、これもうまくいきませんでした。 私はClassBのメソッドを嘲笑するのではなく、クラス全体をできるだけ分離した状態に保つことを好みます。
環境情報: のPython 3.6.1
任意の助けいただければ幸いです!
あなたのテストでは、どのオブジェクトが 'print(c.b)'ですか?それは 'ClassB'のインスタンスですか? – dm03514
それはNoneでしたが、あなたの質問は私にインスタンス属性と同じ名前のクラス属性があることを実感させました!今修正されました – geoforce