2017-04-11 6 views
0

Goパッケージが "dal"パッケージによって提供されたvarインスタンスを使用していることを確認したいと思います。誤ってdbアクセスパッケージを直接インポートして使用することはありません。私のパッケージが特定のパッケージをインポートしないというテストを単体テストできますか?

私はソースでregexp検索を行うことができますが、標準のGoテストでルールを確実にする方法があるのだろうかと思いますか?

インタフェースパッケージ:

package dal 

type UserDal interface { 
    GetUser(id int) User 
} 

実装パッケージ:

package dal_db_specific 

import (
    "some_db" 
    "dal" 
) 

type UserDalDbSpecific struct { 
} 

func (_ UserDalDbSpecific) GetUser(id int) User { 
    some_db.executeQuery(...) 
    ... 
    return user 
} 

register_dal() { 
    dal.UserDal = UserDalDbSpecific{} 
} 

ユーザーコードパッケージ:

import (
    "dal" 
    "some_db" <-- Fail here! 
) 

func someFunc() { 
    user := dal.User.GetUser(1) // Right way 
    some_db.DoSomething() <-- Fail here! 
} 

ちょうど私がするつもりです何のアイデアを与えるために

+0

'dal'が他の' db'パッケージと異なる型を返す場合、リフレクションを使用してパッケージパスを含む 'var'の型をチェックすることができます。しかし 'dal'が' db'で定義された型を返す場合、regexpの代わりに 'go/ast'とcoを使用することができます。パッケージがソースでどのように 'var'が設定されているのかを判断することができますが、もしそれが愚かであればわかりません...しかし正直言って、あなたの意見を聞きたい場合は、過度に複雑なテストをしなければならないのは、通常、悪い設計の匂いです。 – mkopriva

+0

"dal"は、それぞれのDAL実装によって割り当てられたインターフェイスvarを保持します。依存性注入を考えてください。 質問するコードを追加します。 –

+1

あなたのアップデートがある場合、特定のパッケージのインポートとそのパッケージの使用を許可したくない場合、リフレクションは役に立ちません。 'reflect'パッケージはどのパッケージがインポートされたかをあなたに伝えることができません特定のパッケージがどこでどこでどのように使用されているかを伝えることはできません。私は@David Joynerのソリューションに行きます。 – mkopriva

答えて

5

Slightl grepより信頼性が高い:標準ソースparser packageを使用してターゲットソースを解析し、ASTを検査する。あなたはImportSpecノードがDBアクセスパッケージと一致することを探しています。見つかった場合は、テストに失敗します。

+0

可能であれば、反射が速くなるべきだと私は思っていましたか? –

+0

@AlexanderTrakhimenok:リフレクションにはプログラムのコンパイルと実行が必要ですが、ファイルの解析はソースの読み込みのみに依存します。また、 "パッケージ"に反映することもできません。パッケージが使用されていない場合、コンパイルされたバイナリには存在しません。 – JimB

+0

@Jimbしかし、標準のGoユニットテストを実行しているときには、パッケージをコンパイルします。そして、私は反射がうまくいくはずだと思います。 –

関連する問題