2015-05-15 184 views
0

我想模擬我們的git包裝器,以便我們可以測試它。我打算使用mockproc python庫,它提供了用提供的腳本來模擬任何進程名稱的功能。它的作品是這樣的 -使用python裝飾器來裝飾功能的一部分

self.scripts.append('process-name', returncode=0, stdout="output to process") 
with self.scripts: 
     run_and_handle_result() 

我需要添加一個裝飾層,以便我可以做一些額外的事情,如處理重試。我想是這樣的 -

@mockproc('git') # tells that we are mocking git 
def test_something(mock_proc): 
    mock_proc.set_script("sleep (60)") 
    # Run some git command 
    mockproc.check_exit_signal() 

的問題是我希望我的裝飾處理with self.scripts部分。所以我想要的是裝飾器運行該函數,將進程名稱設置爲git,這很簡單。然後運行測試函數,添加腳本並在git命令周圍添加with self.script,然後恢復該函數。

有沒有辦法做到這一點?是一個裝飾者不好的方式來實現它?這不是一個美容要求。我需要這個,因爲在我的一些命令中有重試邏輯,爲此我需要提供多個腳本來進行mockproc並多次運行。

+0

你還需要這個嗎?我認爲代碼片段太短以至於無法完成所有您想要完成的任務 - 您能否舉一些說明性示例:在測試環境之外應該做什麼,以及測試環境中的預期行爲是什麼?我相信你想要的東西可以通過上下文猴子補丁來實現,但我必須更好地理解它 – jsbueno

回答

1

如果我正確地理解了你,你想覆蓋一個函數的命名自由變量。您可以使用fun.func_globals[some_name] = some_value。例如。

def x(a): 
    pow2(a) 

x.func_globals['pow2'] = lambda y: y*y 

x(3) == 9 
+0

我的問題是,每個測試的名稱都會有所不同,所以我不能覆蓋它。 –