2016-07-25 139 views
1

有沒有人有任何成功或有任何想法是什麼將模擬條目(用於測試目的)到golang.org/x/crypto/ssh/terminal包中的term.ReadPassword(int(os.Stdin.Fd()))呼叫的最佳方式?嘲諷加密/ ssh /終端

我試圖創建一個臨時文件(VS os.Stdin)和寫作一樣testing\ntesting\r到臨時文件的字符串值,但我得到的錯誤inappropriate ioctl for device。我猜這是TTY相關的或缺少特定格式(?)的東西,但我真的不確定。

幫助讚賞。

+0

你用什麼方式測試'terminal.ReadPassword'?您是否試圖向該包添加測試?該功能只能在終端上運行,所以如果您沒有終端,請不要使用該功能。 – JimB

+0

我寫了一個使用該函數的庫。正試圖創建一個測試,主要是爲了確保我有全面的覆蓋,但它不是100%必要的。 我使用'bufio.Reader'進行常規輸入,我可以修改該文件來處理該測試用例,但'terminal.ReadPassword'似乎不能以相同的方式工作。 如果您有任何建議,圖書館就在這裏(並不意味着是一個插件):https://github.com/goposse/tardy – Luke

+0

你只需要使用ReadPassword條件就有一個tty。你可以通過將它包裝在另一個函數中,像Corbin建議的那樣嘲笑一個PasswordReader,或者在if語句中添加另一個條件來檢查IsTerminal。 – JimB

回答

1

如果您通過創建os.Stdin引用的假文件來對此測試進行存根化,那麼當您嘗試處理ReadPassword()時,測試將變得非常具體。這是因爲根據操作系統,Go正在編譯單獨的系統調用。 ReadPassword()實現了here,但基於體系結構和操作系統的系統調用在this directory。正如你可以看到有很多。我想不出一個好的方法來按照你指定的方式來存儲這個測試。

您的問題的認識有限,我建議的解決辦法是將注入的線沿線的一個簡單的接口:

type PasswordReader interface { 
    ReadPassword(fd int) ([]byte, error) 
} 

func (pr PasswordReader) ReadPassword(fd int) ([]byte, error) { 
    return terminal.ReadPassword(fd) 
} 

這樣你可以在一個假的對象傳遞給你的測試,和存根對ReadPassword的迴應。我知道這就好像爲你的測試寫代碼一樣,但是你可以重新考慮這個想法,因爲terminal是一個應該注入的外部依賴(I/O)!因此,現在您的測試不僅確保您的代碼正常工作,而且實際上幫助您做出良好的設計決策。

+0

有意義,實際上這有助於整理代碼的這一部分。感謝您的建議! – Luke