2017-06-16 7 views
1

価値私はインスタンス化とcfgB.Idプロパティ呼び出しの両方を模擬しようとしています。、ではない私は、以下の構成クラスがいる

import unittest 
import unittest.mock imort MagicMock 
import mock 
from FileRunner import FileRunner 

class TestFileRunner(unittest.TestCase): 
    @mock.patch('ConfigB.ConfigB.__init__') 
    @mock.patch('ConfigB.ConfigB.Id') 
    def test_methodscalled(self, cfgBId, cfgBInit): 


    fileRunner = FileRunner() 

    cfgBId.return_value = 17 

    cfgBInit.return_value = None 

    print(cfgBId) 

    fileRunner.runProcess(1) 

fileRunnerが呼び出される前のprint(cfgBId)ステートメントに注意してください。 FileRunnerにラインで呼び出さ取得されていない

cfgBId.return_value = 17 

()クラス:私はテストクラスでここに戻り値を設定したときにいくつかの理由

<MagicMock name='Id' id='157297352'> 
<MagicMock name='Id' id='157297352'> 

:私は、次のような出力が得られます。

print(cfgB.Id) 

設定プロパティを正しく表示するには、何が必要ですか?

また、私の 'ConfigB'クラスのインスタンス化は、Idプロパティにインスタンス化と呼び出しをパッチしたい理由よりもはるかに複雑です。

*更新:@mgilsonにより示唆されるように、私は私のクラスを変更したが、まだ動作していない:

<MagicMock name='ConfigB' id='157793640'> 
<MagicMock name='ConfigB().Id' id='157020512'> 

import unittest 
import unittest.mock imort MagicMock 
import mock 
from FileRunner import FileRunner 

class TestFileRunner(unittest.TestCase): 
    @mock.patch('FileRunner.ConfigB') 
    def test_methodscalled(self, cfgB): 

    fileRunner = FileRunner() 

    cfgB.Id = 17 

    print(cfgBId) 

    fileRunner.runProcess(1) 

は、私が今、2つの印刷文から次の出力を取得しています

上記がうまくいかない理由がありますか?

*ソリューション:

私はそれを示唆し@mgilson試験方法に若干の変更後に仕事を得ることができた:私は今、次の出力を得る

import unittest 
import unittest.mock imort MagicMock 
import mock 
from FileRunner import FileRunner 

class TestFileRunner(unittest.TestCase): 
    @mock.patch('FileRunner.ConfigB') 
    def test_methodscalled(self, cfgB): 

    fileRunner = FileRunner() 

    cfgB().Id = 17 

    print(cfgBId) 

    fileRunner.runProcess(1) 

<MagicMock name='ConfigB' id='157147936'> 
17 

答えて

1

FileRunner名前空間のConfigBオブジェクト全体を置き換えるほうがいいと思えます。 @mock.patch('FileRunner.ConfigB')はモックとFileRunner名前空間でConfigBクラスを交換しようとしていること

import unittest 
import unittest.mock imort MagicMock 
import mock 
from FileRunner import FileRunner 

class TestFileRunner(unittest.TestCase): 
    @mock.patch('FileRunner.ConfigB') 
    def test_methodscalled(self, cfgB): 
    fileRunner = FileRunner() 
    cfgB.return_value.Id = 17 
    fileRunner.runProcess(1) 

注:次に、あなたのテストは次のようになります。あなたは好きなことをするためにモックを設定することができます。 Idは17になります。

+0

私はそれを実装しようとしました(私の記事の私の編集を参照)。しかし、私はまだ正しい出力を得ていません。 – EliSquared

+0

Acutally @mgilson私はそれを動作させることができました。あなたのコードの行を 'cfgB.Id = 17'から' cfgB()。Id = 17'に変更したと思います。かっこですべてが変わりました。それはあなたに理にかなっていますか?括弧を含めるように投稿を編集すると、それを解決策としてマークすることができます。 – EliSquared

+1

@EliSquared - うん、意味がある。 'Id 'をあなたのモックの' return_value'に添付したいのですが、モックそのもの(私の悪いこと)ではなく。これを反映するようにコードを編集しました。 – mgilson

0

モックIDプロパティをモックするには、そのようなプロパティでインスタンス化されたモックでクラスをパッチすることができます:

@mock.patch('ConfigB.ConfigB', Mock(Id='17')) 
def test_methodscalled(self, cfgB): 
    cfgB.return_value.__init__.return_value = None # FWIW, this isn't necessary 
+0

私はあなたの提案を働かせることができませんでしたが、@ mgilsonの助けを借りて解決策を見つけました。私の最終更新を参照してください。 – EliSquared

関連する問題