2017-02-13 72 views
0

我有一個看起來像這樣的功能:Python - 如何對使用Popen的這種方法進行單元測試?

def run_shell_command_return_output(command_array): 
    output = [] 
    p = Popen(command_array, stdout=PIPE, bufsize=1) 
    with p.stdout: 
     for line in iter(p.stdout.readline, b''): 
      output.append(line.decode('utf8').strip()) 
    p.wait() 
    return output 

我想弄清楚,使用此方法,以便它實際上並沒有觸及文件系統,而是進行單元測試代碼如何使用假返回數據和狀態代碼。

我已經看到了如何嘲笑使用POPEN溝通()的代碼,如How to unit test a function that uses Popen?信息,但我一直無法弄清楚如何以這種方式使用POPEN嘲笑代碼。

我該如何在這裏僞造popen,以便這種方法可以返回假輸出?

回答

1

首先,我會更簡單地重寫函數。特別是,with聲明是不必要的,因爲您既不開放(也不負責關閉)p.stdout

def run_shell_command_return_output(command_array): 
    output = [] 
    p = Popen(command_array, stdout=PIPE, bufsize=1) 
    for line in p.stdout: 
     output.append(line.decode('utf8').strip()) 
    # I think the wait is redundant, since reads on p.stdout 
    # would block if p is still running. 
    p.wait() 
    return output 

我們測試一下,你剛纔嘲笑Popen和配置p.stdout要與所需的數據文件的對象。

with mock.patch('Popen') as mock_popen: 
    mock_popen.return_value.stdout = io.StringIO("data\ndata\ndata\n") 
    output = run_shell_command_return_output(["what", "ever"]) 
assert output == ["data", "data", "data"] 
相關問題