2017-10-04 102 views
4

我有一個F#庫,裏面有很多我想測試的非公開內容。目前,所有不屬於程序集公共API的代碼都標記爲internal(具體來說,它放置在標記爲internal的模塊中)。我使用InternalsVisibleToAttribute使此代碼對我的測試程序集可見。然而,爲了讓測試程序集編譯,在簽名中使用內部類型的所有測試(其中大部分是因爲我使用FsCheck來自動生成測試輸入)也必須標記爲內部(這需要應用於每個函數,因爲內部模塊不會被xunit發現)。此外,任何專門用於FsCheck生成的類型(例如,type ValidCustomer = ValidCustomer of Customer,其中Customer是我的內部域類型)也需要標記爲內部類型,並且在創建內部類型時FsCheck似乎會卡住,因此測試無法運行。可以測試內部代碼而不必將測試代碼標記爲內部代碼?

有沒有什麼辦法可以測試內部F#代碼(來自單獨的測試程序集)而不必將所有依賴內部類型的測試標記爲內部?現在我只是傾向於在原代碼中根本沒有做任何內部的事情,但理想情況下,有一種方法可以讓我的清潔API蛋糕也吃掉。

+1

爲什麼你的*域*類型是內部的?除非您使用與[DDD](http://amzn.to/WBCwx7)大不相同的術語,否則域模型是您的應用程序中最重要的部分。這是應用程序首先存在的原因... –

+0

@MarkSeemann或許*域類型*是錯誤的術語。在這種特殊情況下,它是一個單獨的項目,它從數據倉庫數據庫中讀取數據,彙總銷售數據等,並將這些數據公開給Web API。 API主要獲取數字數據,但是有很多內部的,很好的域類型(客戶,訂單等等 - 他們正在對域進行建模,儘管它們不在本項目之外使用),用於生成彙總數據。 – cmeeren

+0

好的,但是使這些類型成爲內部的動機是什麼? –

回答

2

我發現OO世界通常會非常反對嘗試直接測試任何內部/私有內容。

在功能世界中,我已經看到更多傾向於公開使用不公開的公共功能,因此可以對其進行測試。看到這個comment from Edward Kmett

當我開始編寫Haskell時,我開始重新思考我用來處理封裝和隱藏的方式。

...

總的來說,我露出全部顯着細節,構造和所有爲我的數據類型,通過某種。內部模塊的大風扇,即使我想封裝和安全API的其餘部分。

...

由於你就可以使用這些新暴露出來的膽量做很好的測試副作用。 =)

在原始評論中有很多更多的細節,並且有一個討論,他詳細討論了這個問題,但我現在找不到它。

你也可以給模塊一個非常難看的名字,如__INTERNAL__,以阻止它的使用。