2017-04-06 7 views
1

os.environ.get私はあなたを助けることを望んでいるのを苦労しています。インポートされたクラスからのPythonの模擬

私は、インポートされたBaseClassを持っています。 BaseClassメソッドをsub_classモジュールにインポートするときに、そのbase_classファイルのos.environ.get呼び出しを疑似しようとしています。

project.data.base_class.py

import os 

class BaseClass(object): 
    VAR1 = os.environ.get('something') 
    VAR2 = os.environ.get('something') 

    def __init__(self): 
    pass 

    def get(self): 
    return BaseClass.VAR1 

project.data.sub_class.py

from project.data.base_class import BaseClass 

class SubClass(BaseClass): 

    def __init__(self): 

    def run(self): 
    return self.get() 

私はSubClass.runメソッドをテストしたいが、私はからかってみたときに、私は右のモックははos.environのために設定ように見えることはできません。ここで私が試したものです:

from mock import patch 

@patch('base_class.os.environ') 
def test_sub_class_run(self, mock_base): 
    mock_base.get.side_effect = ['var1', 'var2'] 
    from sub_class import sub_class 
    self.assertEqual(sub_class.SubClass.run(), 'var1') 
from mock import patch 

@patch('sub_class.base_class.os.environ') 
def test_sub_class_run(self, mock_base): 
    mock_base.get.side_effect = ['var1', 'var2'] 
    from sub_class import sub_class 
    self.assertEqual(sub_class.SubClass.run(), 'var1') 

私ははos.environ使用しているとき、私が原因のように感じるが、私は適切にからかっていませんよ。私はモックを構造化する適切な方法が、それを模倣して呼び出すことであるかどうかは分かりません。正しく。

これは多かれ少なかれ私の擬似コードです。

+0

'mock_base.get.side_effect = ['var1'、 'var2']'を 'mock_base.get.side.effect = lambda * args:['var1'、 'var2']' –

+0

と置き換えてみてください。 http://stackoverflow.com/questions/31582750/python-mock-patch-os-environ-and-return-value?noredirect=1&lq=1 –

答えて

0

私はこの問題を解決しませんでした。私は自分のコードをリファクタリングしなければならなかったのです。なぜなら、これは本当だと思うが、私が間違っていれば誰かがこれを修正してください!

ライブラリーにパッチを当てようとしたときのように、パッチライブラリは実際にインポートするスクリプトまたはモジュールを実行しているようです。だから私の場合、私はOSコールを模擬しようとしていましたが、私が修正しようとしていたもののOSコールはスクリプトの最外層にありました。パッチを適用しようとすると、私の環境変数は存在しませんでした。その環境変数の取得を自分のクラスに移してパッチを当てようとしました。

これは間違っている可能性があり、私がしたことを誤解しましたが、それが私の問題を解決する方法です。

関連する問題