我想確保我的Go包使用由「dal」包提供的var實例,並且不會意外地直接導入和使用db訪問包。是否有可能單元測試我的軟件包沒有導入特定的軟件包?
我想我可以做源代碼的正則表達式搜索,但我想知道是否有一種方法來確保通過標準的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!
}
Slightl
如果'dal'返回與其他'db'包不同的類型,則可以使用反射來檢查var的類型,包括包路徑。但是,如果'dal'返回'db'中定義的類型,而不是正則表達式,則可以使用'go/ast'和co。包來確定'var'在源代碼中的設置方式和位置,但是我不確定它是否可以證明它的真實性......但說實話,如果你想聽到某人的意見,看起來像你過度使用它,不得不做過度複雜的測試通常是一種糟糕的設計。 – mkopriva
「dal」包含由相應的DAL實現分配的var變量。考慮依賴注入。 我會添加代碼來提問。 –
鑑於您的更新,如果您不想允許導入特定的包和使用該包,反射不會幫助您,'reflect'包無法告訴您哪些包是通過導入的調用包,也不能告訴你如何以及在哪裏使用特定的包。我會選擇@David Joyner的解決方案。 – mkopriva