2017-07-14 9 views
0

私は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

任意の助けいただければ幸いです!

+1

あなたのテストでは、どのオブジェクトが 'print(c.b)'ですか?それは 'ClassB'のインスタンスですか? – dm03514

+1

それはNoneでしたが、あなたの質問は私にインスタンス属性と同じ名前のクラス属性があることを実感させました!今修正されました – geoforce

答えて

0

私はPythonを初めて使ったので、私はclass attributesについて知りませんでした。 ClassBを保持していたClassCのクラス属性と、クラス属性をシャドーにしたというインスタンス属性がありました。

関連する問題