2016-10-02 7 views
6

私は、Google cloud storageを使っているGoにappengineアプリを書いています。 ctxはAppEngineのからのコンテキストでgolangでGoogleのクラウドストレージをテストする方法は?

client, err := storage.NewClient(ctx) 
if err != nil { 
    return nil, err 
} 
defer func() { 
    if err := client.Close(); err != nil { 
     panic(err) 
    } 
}() 
r, err := client.Bucket(BucketName).Object(id).NewReader(ctx) 
if err != nil { 
    return nil, err 
} 
defer r.Close() 
return ioutil.ReadAll(r) 

...:たとえば、私の "読み" のコードのように見える

ユニットテスト(aetestを使用)でこのコードを実行すると、実際にクラウドストレージに要求が送信されます。代わりにaetestが偽のデータストア呼び出しを可能にするのと同様に、これを密かに実行したいと思います。

(おそらくquestionに関連していますが、それはPythonを扱います。リンクされたgithub issueは、Python固有の方法で解決されたことを示しています)。

どうすればいいですか?

+1

https://github.com/golang/mock? –

+0

@SachinNambiarNalavattanon私は偽のストレージを探しています。私はそれを嘲笑して自分自身を偽造することを提案していますか? –

答えて

2

Python開発サーバー上のCloud Storageは、Blobstoreサービスでローカルファイルを使用してエミュレートされます。そのため、テストベッドでBlobstoreスタブ(Python固有)を使用するソリューションが機能しました。ただし、GoランタイムにはCloud Storageのローカルエミュレーションはありません。

Sachinが示唆しているように、Cloud Storageの単体テスト方法はモックを使用することです。これは内部的にや他のランタイムで行われる方法です(nodeなど)。

2

1つの方法として、hereは、ユニットテスト中にGCSクライアントにスタブ用のダウンローダをスワップアウトさせることもできます。まず、Google Cloud Storageライブラリの使い方に合ったインターフェースを定義し、単体テストで仮のデータで再実装します。このような

何か:

type StorageClient interface { 
    Bucket(string) Bucket // ... and so on, matching the Google library 
} 

type Storage struct { 
    client StorageClient 
} 

// New creates a new Storage client 
// This is the function you use in your app 
func New() Storage { 
    return Storage{ 
    client: realGoogleClient, 
    } 
} 

// NewWithClient creates a new Storage client with a custom implementation 
// This is the function you use in your unit tests 
func NewWithClient(client StorageClient) { 
    return Storage{ 
    client: client, 
    } 
} 

全体のサードパーティのAPIを模擬するために定型の多くすることができ、ので、多分あなたはgolang/mockまたはmockeryと、それらのモックの一部を生成することによって、それが簡単に作ることができるでしょう。

関連する問題