Overview
テストを書くときにテストの実行前にデータを作成し、終わったら削除したくなる時がありますね?僕はあります。
Firestore が絡んだテストを書くときに Firestore Emulator を起動した状態で実際にデータを作成して、終わったら削除する場合の実装方法について記載します。
Sample
事前に Firestore Emulator を起動した状態で、愚直に Add してテストが完了したら defer で Truncatate します。
$gcloud beta emulators firestore start --host-port=localhost:$PORT
実装のサンプルは以下のようになると思います。かなり長ったらしいですが、他のテストのケースに影響を与えないように愚直にやるとこんな感じになるかなと思います。
tx := context.Background() fs, err := firestore.NewClient(ctx, "$ProjectName") coll := fs.Collection("$CollectionName") tests := []struct{ name string // テストデータ data interface{} }{ name: "case_1" data: inteface{}{} } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T){ // setup data if _, _, err := coll.Add(ctx, tt.data); err != nil { t.Fatal(err) } // data の削除 defer func(){ refs, err := coll.DocumentRefs(ctx).GetAll() if err != nil { t.Fatal(err) } for _, ref := range refs { batch := fs.Batch().Delete(ref) if _, err := batch.Commit(ctx); err != nil { t.Fatal(err) } } } } }
Refs
See Also
Firestore の js SDK には clearPersisitence というメソッドを教えてもらいまいたが、Go の Firestore SDK には実装されていなかったので使えませんでした...