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!
}
を
ちょうど私がするつもりです何のアイデアを与えるために
'dal'が他の' db'パッケージと異なる型を返す場合、リフレクションを使用してパッケージパスを含む 'var'の型をチェックすることができます。しかし 'dal'が' db'で定義された型を返す場合、regexpの代わりに 'go/ast'とcoを使用することができます。パッケージがソースでどのように 'var'が設定されているのかを判断することができますが、もしそれが愚かであればわかりません...しかし正直言って、あなたの意見を聞きたい場合は、過度に複雑なテストをしなければならないのは、通常、悪い設計の匂いです。 – mkopriva
"dal"は、それぞれのDAL実装によって割り当てられたインターフェイスvarを保持します。依存性注入を考えてください。 質問するコードを追加します。 –
あなたのアップデートがある場合、特定のパッケージのインポートとそのパッケージの使用を許可したくない場合、リフレクションは役に立ちません。 'reflect'パッケージはどのパッケージがインポートされたかをあなたに伝えることができません特定のパッケージがどこでどこでどのように使用されているかを伝えることはできません。私は@David Joynerのソリューションに行きます。 – mkopriva