2016-10-31 14 views
2

私はGithub APIのクライアントとして動作するプログラムを作成しています。私はhttps://github.com/google/go-githubを使ってAPIにアクセスします。私は、引数の1つとしてgithub.Clientを受け取り、それを使ってプル要求からコミットを取得する関数を持っています。私はいくつかの偽のデータでこの関数をテストしたい。構造体をモックする方法フィールドに直接アクセスする場合

ここの記事:https://nathanleclaire.com/blog/2015/10/10/interfaces-and-composition-for-effective-unit-testing-in-golang/私は、githubクライアントで実装されるインターフェイスを作成し、テストではそれを実装するモックを作成する必要があります。私の問題はgo-githubがプル要求を取得するには、次のセマンティクスを使用していること、である:

prs, resp, err := client.PullRequests.List("user", "repo", opt)

インタフェースはしかし、あなたが実装されるべきである方法ではなくフィールドを指定することができます。だから、私はgithub.Clientオブジェクトを模倣して、上記のセマンティクスで使用することができますか?

+1

フィールドをエクスポートしたものをモックする必要はありません。自分自身をgithub.Clientにしてください。 – Volker

+0

しかし、私は本当のgithubを望んでいません。APIに接続するクライアント。静的なデータを返すものが欲しい。 – zefciu

+1

これを実現する1つの方法は、独自のインターフェイスを宣言することです。次に、2つの異なる構造体で実装します。最初のものはgithub APIを呼び出すだけで、もう1つは偽のものです。 – jnmoal

答えて

2

あなたのケースでは特にgithub.Clientの多くの機能を使用している場合は実際的ではないかもしれませんが、埋め込みを使用して定義したインターフェースを実装する新しい構造を作成することができます。

type mockableClient struct { 
    github.Client 
} 

func (mc *mockableClient) ListPRs(
owner string, repo string, opt *github.PullRequestListOptions) (
[]*github.PullRequest, *github.Response, error) { 

return mc.Client.PullRequests.List(owner, repo, opt) 
} 


type clientMocker interface { 
    Do(req *http.Request, v interface{}) (*github.Response, error) 

    ListPRs(string,string,*github.PullRequestListOptions) (
[]*github.PullRequest, *github.Response, error) 
}