os.Stdin
が参照している偽のファイルを作成してこのテストをスタブしている場合、ReadPassword()
を処理しようとすると、テストは非常にOS固有のものになります。なぜなら、フードの下では、GoはOSに応じて別々のシステムコールをコンパイルしているからです。 ReadPassword()
はhereを実装しているが、アーキテクチャおよびOSに基づいて、システムコールは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)であるとして、あなたはこの考えをリフレームすることができます!だから、あなたのテストはコードの動作を保証するだけでなく、実際に優れた設計上の決定を下すのに役立ちます。
どのような方法であなたは 'terminal.ReadPassword'をテストしようとしていますか?そのパッケージにテストを追加しようとしていますか?その関数は端末上でしか動かすことができないので、端末を持っていなければその関数を使わないでください。 – JimB
私はその機能を使用するライブラリを作成しました。テストを作成しようとしましたが、ほとんどの場合、完全にカバーしていましたが、100%必要ではありませんでした。 私は通常の入力のための 'bufio.Reader'を使用していると私は、そのテストケースを処理するために、ファイルを変更することができますが、' terminal.ReadPassword'が同じように動作するようには思えません。あなただけの端末を持つことを条件ReadPasswordを使用して作成する必要があり – Luke
https://github.com/goposse/tardy: ライブラリは、ここ(プラグを意味するものではない)あなたが提案を持っている場合です。あなたは、別の関数でラップコービンが提案したようPasswordReaderをからかっ、または単にIsTerminalをチェックするif文に別の条件を追加することによってそれを行うことができます。 – JimB