2017-06-16 11 views
0

は私が設定クラスをインスタンス化し、そのクラスのメソッドを呼び出すクラスメソッドを持って模擬するために呼び出しますメソッドをテストするが、それが動作していません。モッキング初期化ステップと追加方法は

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

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

    cfgA = MagicMock() 

    fileRunner = FileRunner() 

    cfgB.return_value = None 
    cfgB.return_value.createValue.return_value = 17 

    fileRunner.runProcess(cfgA) 

をしかし、私はクラスをテストするとき、私はエラーを取得:

AttributeError: 'NoneType' object has no attribute 'createValue' 

私はまた、このようなテストクラス書いてみました:

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

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

    cfgA = MagicMock() 

    fileRunner = FileRunner() 

    cfgBMock = mock.Mock() 
    cfgBMock.createValue.return_value = 17 

    cfgB.return_value = cfgBMock 

    fileRunner.runProcess(cfgA) 

をしかし、私はこれをしようとすると、私はエラーを取得:

TypeError: __init__() should return None, not 'Mock' 

は私が間違って何をしているのですか?私のクラスをテストする良い方法はありますか?

*編集:ドン・カービー1として

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.createValue') 
    def test_methodscalled(self, createValue, cfgB): 

    cfgA = MagicMock() 

    fileRunner = FileRunner() 


    createValue.return_value = 17 

    cfgB.return_value = None 

    fileRunner.runProcess(cfgA) 
+0

可能性のある重複しました[ Mock親クラス\ _ \ _ init \ _ \ _メソッド](https://stackoverflow.com/questions/32349855/mock-parent-class-init-method) – grundic

+1

Initは[None以外の値を返さない場合があります](https: //docs.python.org/3/reference/datamodel.html#object.__init__)、またはTypeErrorが発生しています。あなたが 'ConfigB.createvalue'を模倣したければ、' @ mock.patch( 'ConfigB.ConfigB.createvalue') 'をしてはいけませんか? –

+0

@IljaEveriläが働いていました。更新されたテストメソッドを追加しました。ありがとう。 – EliSquared

答えて

0

、私は質問への答えとして私の解決策を入れている:ここでは以下のコメントに基づくソリューションですの

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.createValue') 
    def test_methodscalled(self, createValue, cfgB): 

    cfgA = MagicMock() 

    fileRunner = FileRunner() 


    createValue.return_value = 17 

    cfgB.return_value = None 

    fileRunner.runProcess(cfgA) 
関連する問題