mercari.go #1 で Web アプリケーションにおけるテスト実装パターンについて話しました。
スライドに書いたパターンはあくまで「僕の環境で必要になったからこう書いた」集なので、環境に応じた書き方を行うことが絶対ベストエフォートだと思っています。しかし、「テストを楽にするための設計」は必ず私達を後々楽にしてくれるので、最初の設計段階から心がけるべきです。
DB の設計に関しては github.com/jmoiron/sqlx
を参考にしました。
めっちゃ最強の mock 技法考えた!と思ったんですが、先駆者(@haya14busa さん)がすでにいたのでここに参考になるリンクを書いておきます。
しかし、自動生成ツールは僕が作ってるので是非 github に星ください!!
追記
懇親会で話に上がったのですが、interface が持つメソッドの返り値が構造体かつ、その構造体がメソッドを持っていた場合はそれも interface にしなければなりません。
なので今回だと *sql.Row
や *sql.Rows
が持つメソッドを interface として宣言する必要がありました。
type Row interface { Scan(dest ...interface{}) error } type Rows interface { Columns() ([]string, error) Err() error Next() bool NextResultSet() bool Scan(dest ...interface{}) error } func (db *DBMock) Query(q string, args ...interface{}) (Rows, error) { return nil, nil } func (db *DBMock) QueryRow(q string, args ...interface{}) Row { return nil }