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できるようになる。

ブログに残しておこうと思っていたのにいつの間にか数ヶ月経っていてよくないな。。