🧪

Golangのunit testでmultipart.FileHeaderオブジェクトを作成する

2024/02/08に公開

ファイル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