困ったこと
こういうテストコードを書いていました。
テスト用にpng画像のデータをbase64でコード化しておいて使い回していました。
test_image.go
package test_image
import (
"bytes"
"encoding/base64"
)
func GetTestAsset(key string) io.Reader {
src := "iVBORw0KGgoAAAAN..." // png画像のbase64データ
data, _ := base64.StdEncoding.DecodeString(src)
r := bytes.NewReader(data)
return r
}
そしてテスト本体はこんな感じです。
func Test(t *testing.T) {
t.Run("Hoge hoge test", func(t *testing.T) {
asset := test.GetTestAsset()
resultBuffer := HogeReadAsset(asset)
buf, _ := ioutil.ReadAll(asset)
assert.Equal(t, buf, b) // Fail
})
}
テスト対象メソッドのHogeReadAsset()でasset.Read()で最後までシークされる想定なので、
その後にioutil.ReadAll()をしても空配列しか返ってこないのでテストが失敗するのです。
io.ReaderのSeek位置を初期化できればいいのになあと思うのですが、
io.ReaderにはRead()しか実装されていません。
io/io.go
type Reader interface {
Read(p []byte) (n int, err error)
}
さあ困ったどうしよう。
最初からstructを返せば良い
というわけでこうしました。
test_image.go
(省略)
func GetTestAsset(key string) *bytes.Reader {
src, _ := "iVBORw0KGgoAAAAN..." // png画像のbase64データ
data, _ := base64.StdEncoding.DecodeString(src)
r := bytes.NewReader(data)
return r
}
bytes.ReaderはSeek()を持ってます。
func (r *Reader) Seek(offset int64, whence int) (int64, error) {
これでテストが通ります。
以上