2017-08-22 72 views
1

我有以下方法:模擬方法屬性蟒蛇拋出AttributionError

def get_countries(cities): 
    prefix = os.getenv("PREFIX") 
    ... 
    ... 

我想嘲笑這個前綴屬性(因爲我沒有找到一個方法來嘲笑在os.getenv("PREFIX")@mock.patch.dict(os.environ, {"PREFIX": "P"})只需一個鍵 - 會嘲笑整個字典,而且有可能是我想保留其他鍵

所以我寫了以下內容:

@mock.patch.object("get_countries", "prefix", "P") 
    def test_get_aggregated_performance_records_countries_min_spend(): 
    ... 

我得到一個n錯誤:

AttributeError: get_countries does not have the attribute 'prefix' 

我在做什麼錯?

回答

1

prefix不是get_countries函數的屬性。這是一個函數範圍的變量,也就是封閉在get_countries,但它不是get_countries :)

一個屬性如果修補os.environ是不可接受的,你可以重構暴露prefix作爲參數:

def get_countries(cities, prefix=os.getenv("PREFIX")): 
    ... 
    ... 

製作爲單元測試提供一個值是微不足道的。


此外,如果你patchos.environ,它應該隻影響當前的測試案例。您需要爲單個測試指定多少個密鑰?

+1

我更喜歡使用模擬,而不是修改我的測試代碼。有沒有辦法模擬函數作用域變量? 關於os env的問題 - 這意味着我們需要維護這個補丁,如果我們計劃在未來使用更多的sys env,在其他情況下,它們的值不會影響測試。 – Dejell