datastoreに依存したテストはStronglyConsistentDatastoreをtrueにする
Goを書き始めた頃、テストで下記のようにcontextを生成していた。
ctx, done, e := aetest.NewContext() if e != nil { t.Fatal(e) } defer done() // 1. Putする // 2. 1でPutしたデータをGetする
このコードには、datastoreにPutした直後にGetするとデータを取得できずテストが落ちるという問題があった。
これを解決するには aetest.Options{StronglyConsistentDatastore: true}
Instance生成時の引数に渡してあげればいい。
しかし、aetest.NewContext
には引数でoptionを渡すことはできない。
github.com
aetest.NewInstance
にoptionを渡せるメソッドを作り、datastoreが絡むテストはこのメソッドを使うようにしている。
func NewContext(option aetest.Options) (context.Context, func(), error) { inst, err := aetest.NewInstance(&option) if err != nil { return nil, nil, err } req, err := inst.NewRequest("GET", "/", nil) if err != nil { inst.Close() return nil, nil, err } ctx := appengine.NewContext(req) return ctx, func() { inst.Close() }, nil }
呼び出し側
option := aetest.Options{StronglyConsistentDatastore: true} ctx, done, e := NewContext(option) if e != nil { t.Fatal(e) } defer done()
このようにすれば、Putしてdatastoreに反映したものをGetできるようになる。
ブログに残しておこうと思っていたのにいつの間にか数ヶ月経っていてよくないな。。