main.go
ファイルを含むアプリケーションがあります。この演習では、HTTPサーバーは興味深いものではありませんが、使用する抽象化は興味深いものです。それはPlayerStore
に依存しています。FileSystemPlayerStore
を作りました。これを新しいアプリケーションで再利用できるはずです。$GOPATH/src/github.com/your-name/my-app
package main
内にmain
関数が必要です。これまでのところ、「ドメイン」コードはすべてpackage main
内にあり、func main
はすべてを参照できます。cmd
ディレクトリを作成し、その中にwebserver
ディレクトリを作成します(例:mkdir -p cmd/webserver
)。main.go
を移動します。tree
がインストールされている場合は、それを実行し、構造は次のようになります。main
」にする必要があることを忘れないでください。poker
というパッケージを作成します。main.go
にインポートして、それを使用してWebサーバーを作成できるようにする必要があります。次に、poker.FunctionName
を使用してライブラリコードを使用できます。go get
を実行するだけで済みます。go test
」を実行し、まだ合格していることを確認しますcmd/webserver
内に移動し、go run main.go
を実行しますhttp://localhost:5000/league
にアクセスすると、まだ機能していることがわかりますcmd
内にcli
(コマンドラインインターフェイス)という別のディレクトリを作成し、次のようにmain.go
を追加します{PlayerName} wins
」と入力したときに勝利を記録することです。CLI
と呼ばれるものを作ってポーカーをPlay
できるようにする必要があることはわかっています。ユーザー入力を読み取り、勝利をPlayerStore
に記録する必要があります。PlayerStore
とどのように統合できるかを確認するためのテストを作成してみましょう。CLI_test.go
内(cmd
内ではなくプロジェクトのルート内)StubPlayerStore
を使用できますCLI
タイプに渡しますPlayPoker
メソッドでゲームをトリガーしますCLI
構造体を作成し、メソッドを追加するのに十分快適であるはずです。Stdin
(ユーザーからの入力)からの読み取りをシミュレートする必要があります。os.Stdin
は、ユーザーの入力をキャプチャするためにmain
で使用するものです。これは内部的には*File
であり、これはio.Reader
を実装していることを意味します。strings.NewReader
を使用してio.Reader
を作成し、ユーザーが入力することを期待する内容を入力します。./CLI_test.go:12:32: too many values in struct initializer
CLI
に追加する必要があります。server_test
では、ここでのように勝利が記録されているかどうかを以前に確認しました。そのアサーションをヘルパーにDRYにしてみましょうserver_test.go
とCLI_test.go
の両方のアサーションを置き換えます。パッケージbufioはバッファI/Oを実装しています。io.Readerまたはio.Writerオブジェクトをラップし、別のオブジェクト(ReaderまたはWriter)を作成します。このオブジェクトもインターフェイスを実装しますが、バッファリングとテキストI/Oのヘルプを提供します。
Scanner.Scan()
は改行まで読み込みます。Scanner.Text()
を使用して、スキャナーが読み取ったstring
を返します。main
に接続する必要があります。できる限り迅速に、完全に統合された実用的なソフトウェアを使用できるように常に努力する必要があることを忘れないでください。main.go
に以下を追加して実行します。(2番目の依存関係のパスをコンピューター上のものと一致するように調整する必要がある場合があります)CLI
のフィールドplayerStore
およびin
に割り当てようとしているためです。これらは、エクスポートされていない(private)フィールドです。テストはCLI
(poker
)と同じパッケージにあるため、テストコードでこれを行うことができました。しかし、main
はパッケージmain
にあるため、アクセスできません。CLI
の依存関係を正しく(CLI
のユーザーに公開したくないため)にしましたが、ユーザーがそれを構築する方法を作りませんでした。package mypackage_test
main
のように)、どうでしょうか?_test
」を付けることを強くお勧めします。これを行うと、パッケージ内のパブリックタイプにのみアクセスできます。これは、この特定のケースに役立ちますが、パブリックAPIのみをテストするという規律を強化するのにも役立ちます。それでも内部をテストしたい場合は、テストしたいパッケージで別のテストを行うことができます。package foo_test
を使用すると、パッケージのユーザーのようにコードをインポートする場合と同じようにコードをテストするように強制することで、これを支援します。poker
パッケージの_test.go
ファイルで定義されているため、CLI_test
では使用できなくなりました。poker
パッケージを使用する誰もが、コードを操作したい場合、独自のスタブPlayerStore
を作成する必要がないことを意味します。testing.go
というファイルを作成して、スタブとヘルパーを追加しましょう。CLI
テストでは、別のパッケージ内でコードを使用しているかのようにコードを呼び出す必要があります。main
と同じ問題が発生することがわかります。bufio.Scanner
を格納するように、CLI
も変更します。main.go
に戻り、先ほど作成したコンストラクタを使用できます。"Bob wins"
」と入力してください。PlayerStore
を返すようにカプセル化する関数を作成する必要があります。FileSystemPlayerStoreFromFile
は終了関数を返すため、ストアの使用が終了したら、基になるファイルを閉じることができます。main
に個別のフォルダーを用意する必要がありました。mypackage_test
」がコードと統合する他のパッケージと同じ経験であるテスト環境の作成にどのように役立つかを学び、統合の問題を見つけて、コードの操作がどれほど簡単かを確認しました。os.Stdin
は、io.Reader
を実装しているため、読み取りが非常に簡単です。 「bufio.Scanner
」を使用して、ユーザー入力を1行ずつ簡単に読み取ることができました。PlayerStore
」を新しいアプリケーションに統合するのはほとんど手間がかかりませんでした(パッケージの調整を行った後)。 スタブバージョンも公開することにしたため、テストも非常に簡単でした。