2017-04-11 52 views
0

我想確保我的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
+0

如果'dal'返回與其他'db'包不同的類型,則可以使用反射來檢查var的類型,包括包路徑。但是,如果'dal'返回'db'中定義的類型,而不是正則表達式,則可以使用'go/ast'和co。包來確定'var'在源代碼中的設置方式和位置,但是我不確定它是否可以證明它的真實性......但說實話,如果你想聽到某人的意見,看起來像你過度使用它,不得不做過度複雜的測試通常是一種糟糕的設計。 – mkopriva

+0

「dal」包含由相應的DAL實現分配的var變量。考慮依賴注入。 我會添加代碼來提問。 –

+1

鑑於您的更新,如果您不想允許導入特定的包和使用該包,反射不會幫助您,'reflect'包無法告訴您哪些包是通過導入的調用包,也不能告訴你如何以及在哪裏使用特定的包。我會選擇@David Joyner的解決方案。 – mkopriva

回答

5

y比grep更可靠:使用標準parser package解析目標源並檢查AST。您需要尋找ImportSpec與數據庫訪問包匹配的節點。如果發現任何錯誤,則通過測試。

+0

我在想如果可能的話反射應該更快? –

+0

@AlexanderTrakhimenok:反射需要編譯和運行程序,而解析文件只需要讀取源文件。你也不能反思一個「包」 - 如果包未被使用,它在編譯後的二進制文件中不存在。 – JimB

+0

@Jimb,但是當我運行標準Go單元測試時,它會編譯包。我認爲反思應該在那裏工作得很好。 –

相關問題