2017-09-15 13 views
0

私のコードベースの一部をテストしている間に、 "gopkg.in/mgo.v2"のオブジェクトをインターフェイスでモックアウトすると便利です。私はmgo.Queryがインターフェイスクエリを実装していない問題に遭遇しています。mocking mgo chaining functions

import mgo "gopkg.in/mgo.v2" 

type Collection interface { 
    FindId(interface{}) Query 
    Find(interface{}) Query 
    UpdateId(interface{}, interface{}) error 
    Update(interface{}, interface{}) error 
    UpsertId(interface{}, interface{}) (interface{}, error) 
    Insert(...interface{}) error 
    RemoveId(interface{}) error 
} 

type Query interface { 
    One(interface{}) error 
    All(interface{}) error 
    Select(interface{}) Query 
} 

var _ Query = (*mgo.Query)(nil) 

クエリはエラーアップキックをキャスト:

cannot use (*mgo.Query)(nil) (type *mgo.Query) as type Query in assignment: 
    *mgo.Query does not implement Query (wrong type for Select method) 
     have Select(interface {}) *mgo.Query 
     want Select(interface {}) Query 

が、これはチェーン機能は、インターフェイスで定義されていることができないとの問題ですか?私は、mgoの実装と一致するSelectヘッダを作る方法がわかりません。

答えて

0

機能シグネチャが異なるため、コンパイルエラーが発生しています。 SelectのインタフェースバージョンはQueryタイプを返す一方、mgoのSelect*mgo.Queryを返します。これは異なるタイプです。たとえそのタイプがであっても、があなたのインターフェイスを実装していても、関数のシグネチャはまだ異なります。 mgoパッケージをラップできる別のレイヤーをこのレイヤーに追加する必要があります。

type MgoQuery struct { 
    *mgo.Query 
} 

func (q *MgoQuery) Select(selector interface{}) Query { 
    return q.Query.Select(selector) 
} 

...