免責事項:私はあなたにメリーXMasが欲しいと私は私の質問があなたを邪魔しないことを願っています!CLIテストのための "fmt" golangライブラリパッケージを扱う方法
sample.go:
package main
import(
"fmt"
"os"
)
type sample struct {
value int64
}
func (s sample) useful() {
if s.value == 0 {
fmt.Println("Error: something is wrong!")
os.Exit(1)
} else {
fmt.Println("May the force be with you!")
}
}
func main() {
s := sample{42}
s.useful()
s.value = 0
s.useful()
}
// output:
// May the force be with you!
// Error: something is wrong!
// exit status 1
私はgolangテストでインターフェイスを使用する方法について多くの研究を行いました。しかし、これまでのところ、私は完全にこの周りに私の頭を包むことができませんでした。少なくとも、私が "嘲笑"(この言葉を使用することに謝罪)する必要があるとき、インタフェースが私にどのように役立つかはわかりません。 "fmt"のようなライブラリパッケージ。
私は2つのシナリオを思い付いた:私はコントロールを持っているし、出力をチェックすることができる午前
- ラップFMTにパッケージをコマンドラインインターフェイスをテストするために使用するOS/execの文字列
どちらのシナリオも好きではない:
- 私は、実際のコマンドラインに畳み込まれたものではありません(下記参照)。移植性の問題もあります。
- 私はこの方法を検討していますが、fmtパッケージをラップすることは、少なくともテストのためのパッケージをラップすることで多大な作業になるかもしれないと懸念しています。
実際の質問:別の(より良い/より単純な/慣用的な)方法がありますか? 注:私は純粋なゴランでこれをやりたい、私は次のテストフレームワークに興味がありません。
cli_test.go:Kerninghamのブックの
package main
import(
"os/exec"
"testing"
)
func TestCli(t *testing.T) {
out, err := exec.Command("go run sample.go").Output()
if err != nil {
t.Fatal(err)
}
if string(out) != "May the force be with you!\nError: this is broken and not useful!\nexit status 1" {
t.Fatal("There is something wrong with the CLI")
}
}
ワウを見て、私はパイクが本を書いたことを知りませんでした。あなたはタイトルまたは書籍への言及を述べてください。私はあなたの助言が好きです。私はそのようなコードをリファクタリングしようとしており、報告しています。どうもありがとうございます! – mark
The Goプログラミング言語 http://www.gopl.io/ Alan A. A. Donovan・Brian W. Kernighan 2015年10月26日にペーパーバックで、11月20日に電子書籍に掲載されました Addison-Wesley; 380pp; ISBN:978-0134190440 – Amnon
あなたのアドバイスに従ってコードをリファクタリングしました。それを明示するためにあなたの答えに出てきたことを加えたことに気にしないことを願っています。私が何か誤解した場合は、それを変更してください。ところで、os.Exitに問題があるようです。 – mark