アルパカ三銃士

〜アルパカに酔いしれる獣たちへ捧げる〜

mercari.go #1 で「もう一度テストパターンを整理しよう」というタイトルで登壇しました

mercari.connpass.com

mercari.go #1 で Web アプリケーションにおけるテスト実装パターンについて話しました。

スライドに書いたパターンはあくまで「僕の環境で必要になったからこう書いた」集なので、環境に応じた書き方を行うことが絶対ベストエフォートだと思っています。しかし、「テストを楽にするための設計」は必ず私達を後々楽にしてくれるので、最初の設計段階から心がけるべきです。

DB の設計に関しては github.com/jmoiron/sqlx を参考にしました。

github.com

めっちゃ最強の mock 技法考えた!と思ったんですが、先駆者(@haya14busa さん)がすでにいたのでここに参考になるリンクを書いておきます。

haya14busa.com

しかし、自動生成ツールは僕が作ってるので是非 github に星ください!!

github.com

追記

懇親会で話に上がったのですが、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
}