inari111 blog

Webエンジニアの備忘録

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

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