🧪
Golangのunit testでmultipart.FileHeaderオブジェクトを作成する
ファイルuploadやdownloadの処理をgolangで実装すると、unit testでmultipart.FileHeaderオブジェクトを作成したいケースがあります。
具体的には以下のようなケースのコードのunit testを書く場合です
func hoge(fileData *multipart.FileHeader) {
// something
}
しかし、multipart.FileHeaderオブジェクトをunit test内で生成するコードの書き方を調べても、web上ではなかなか動くコードが見つかりませんでした。
なので当然、chatGPTでコードを生成しても動かないクズコードを出力してきます。(ネット情報が元なので当たり前)
色々調査と試行錯誤をした結果、以下のようなコードを書くことで動かすことができました。
// テスト用のmultipart.FileHeaderオブジェクトを作成する
func MakeTestFileHeader(ext string, dateBytes []byte) (*multipart.FileHeader, error) {
body := new(bytes.Buffer)
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("file", "test"+ext)
if err != nil {
return nil, err
}
if _, err := io.Copy(part, bytes.NewReader(dateBytes)); err != nil {
return nil, err
}
if err := writer.Close(); err != nil {
return nil, err
}
// ダミーファイルをパースして、multipart.FileHeaderを取得する
reader := multipart.NewReader(body, writer.Boundary())
// 2M
form, err := reader.ReadForm(2 * 1_000_000)
if err != nil {
return nil, err
}
fh := form.File["file"]
return fh[0], nil
}
extはテストしたい対象の拡張子です。
dateBytesはテストしたいファイルを読み込んで作成します。
csvFileBytes, err := ioutil.ReadFile("./test/testdata/csvs/invalid.csv")
if err != nil {
panic(err)
}
以上です
Discussion