2016-02-23 9 views
5

テストしようとしているクラスでインスタンス化されたクラスにパッチを適用しようとしていますが、動作しません。私は様々な文書を読んだが、私が間違っていることはまだ見つけていない。ここでは、コードスニペットは次のとおりです。tests/Test.pyunittestを使用して、テスト済みのクラスによってインスタンス化されたクラスをパッチできません。

module/ClassToPatch.py
from module.ClassToTest import ClassToTest 

class Test(object): 

    @mock.patch('module.ClassToPatch.ClassToPatch', autospec = False) 
    def setUp(self, my_class_mock): 
     self.instance = my_class_mock.return_value 
     self.instance.my_method.return_value = "def" 
     self.class_to_test = ClassToTest() 

    def test(self): 
     val = self.class_to_test.instance.my_method() #Returns 'abc' instead of 'def' 
     self.assertEqual(val, 'def') 

module/ClassToTest.py
class ClassToPatch(object): 
    def __init__(self): 
     pass 
    def my_method(self): 
     return "abc" 

from module.ClassToPatch import ClassToPatch 

class ClassToTest(object): 
    def __init__: 
     # Still instantiates the concrete class instead of the mock 
     self.instance = ClassToPatch() 

私はこのケースでは、私は簡単に注入することも可能だろうこれは単なる例に過ぎません。また、ファイルごとに1つのクラスポリシーを使用します。ファイルはクラスのように指定されているため、インポートの名前は変わっています。

+2

@ mock.patch( 'module.ClassToTest.ClassToPatch'、autospec = False)を試してください –

+0

今後サンプルコードを[MCVE](http://stackoverflow.com/help/mcve)にしてください。あなたの投稿されたコードにいくつかのバグがあったので、すぐに問題を見つけて解決策を提示するために、問題に精通している人に頼ることはできません。 –

+0

よろしくお願いします – sixtstorm1

答えて

1

ノルベルトは言及したように、修正は

@mock.patch('module.ClassToTest.ClassToPatch', autospec = False) 

According to the docs

@mock.patch('module.ClassToPatch.ClassToPatch', autospec = False) 

からモック行を変更することである。

パッチ()デコレータ/コンテキストマネージャがそれを行いますテスト中のモジュール内のクラスやオブジェクトをモックするのは簡単です。指定したオブジェクトは、テスト中にモック(または他のオブジェクト)に置き換えられ、テストが終了すると復元されます。

あなたがClassToTestモジュール、ないClassToPatchモジュールをテストしています。

関連する問題