2016-10-25 73 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(設置,ENV_NAME =「ENV1」)'但我得到一個'AttributeError的:「設置」對象有沒有屬性「rsplit'' –

+0

你導入第三方'mock'模塊? https://docs.python.org/3/library/unittest.mock.html#patch-object – chepner

+0

不,它只是Pycharm..weird。否則,我得到一個'類型錯誤:_patch_object()失蹤1個人需要的位置參數:「attribute''我試圖找出在doc什麼模擬需求:) –

相關問題