2016-10-25 20 views
1

私は機能は、特定の環境で実行することができるようにするデコレータを作成:動作するように思われること環境変数を使用するデコレータの単体テスト方法は?

def accepted_environments(*envs): 
    """ 
    The decorated function can be executed only in specified envs 
    """ 
    def my_decorator(func_to_be_decorated): 
     def wrapper(): 
      if settings.ENV_NAME not in envs: 
       raise EnvironmentException 
      return func_to_be_decorated() 
     return wrapper 
    return my_decorator 

# Usage example 
@accepted_environments('local', 'prod') 
def hello(): 
    print("hello") 

が、私はユニットそれをテストしたいと思います。 問題は、私のテストはすべての環境(ローカル、ステージング、プロード)で実行可能であることです。さらに、私のテストでは環境変数を変更することは安全ではないと思います。

この動作を "模擬する"べきですか?どうしますか?ありがとう!

答えて

3

mockを使用して、settings.ENV_NAMEの値をオーバーライドしてテストします。

def test_not_in_dev(self): 
    with mock.patch.dict(settings.__dict__, ENV_NAME="dev"): 
     self.assertRaises(EnvironmentException, hello) 
+0

ありがとうございました。 mock.patch.objetは存在しません(私はPython 3.5を使用しています)。私は 'mock.patch(settings、ENV_NAME =" env1 ")で'しようとしましたが、 'AttributeError: 'Settings'オブジェクトに 'rsplit'属性がありません。 –

+0

サードパーティ' mock'モジュールをインポートしていますか? https://docs.python.org/3/library/unittest.mock.html#patch-object – chepner

+0

いいえ、ちょうどPycharm..weirdです。そうでなければ、私は 'TypeError:_patch_object()が見つかりませんでした。1つの必須の位置引数: 'attribute''私は医者が必要とするものを調べています:) –

関連する問題