2017-04-06 133 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,我不是嘲笑正常。我不確定構建模擬的合適方式是讓它模擬os調用。正常。

這是我的僞代碼或多或少。

+0

嘗試用'mock_base.get.side_effect = lambda * args:['var1','var2']' –

+0

替換'mock_base.get.side_effect = ['var1','var2']' :http://stackoverflow.com/questions/31582750/python-mock-patch-os-environ-and-return-value?noredirect=1&lq=1 –

回答

0

我沒有解決問題。我不得不重構我的代碼,原因是因爲,我認爲這是事實,但如果我錯了,請有人糾正這個問題!

它看起來像當你嘗試修補一個庫時,修補庫似乎實際上運行你正在導入的腳本或模塊。所以在我的情況下,我試圖模擬操作系統調用,但我試圖修補的操作系統調用是在我的腳本的最外層。當我嘗試修補它時,我的環境變量不存在。我必須將該環境變量檢索移到我的班級,然後嘗試修補。

這可能是錯誤的,我誤解了我做了什麼,但這就是我解決我的問題的方法。