2011-08-25 59 views
1

在我的asp.net應用程序,我有以下靜態類來處理查詢字符串在我的應用程序的一些類具有依賴性:什麼是使我的靜態類可測試的最佳方法?

public static class QueryStringUtil 
{ 
    public static int? GetStoreId() 
    { 
     return GetId(QueryStrings.StoreId); 
    } 

    public static string GetItemCode() 
    { 
     return Get(QueryStrings.ItemCode); 
    }  

    private static string Get(string queryStringName) 
    { 
     return HttpContext.Current.Request.QueryString[queryStringName]; 
    } 

    private static int? GetId(string queryStringName) 
    { 
     var queryString = Get(queryStringName); 
     int queryStringParsed; 
     return int.TryParse(queryString, out queryStringParsed) ? (int?)queryStringParsed : null; 
    } 
} 

會是什麼使這個類可測試的最好方法?

我知道的一種方法是重構這個並創建一個單例實例類,而不是它的接口,並使相關類接受我的單例類的接口。不知道這將是我最好的選擇。

另一種選擇是讓我的類成爲一個具有接口的普通類,然後創建一個單例ServiceLocator類,負責將實例保存到所有應該像單例一樣行爲的類,比如我的QueryStringUtil,然後允許我的依賴類接受接口到我的IQueryStringUtil。

我能想到的第三個選擇是不使用我的Custom Service Locator類而是使用IoC容器(例如Microsoft Unity),然後在IoC容器配置文件中保存一個單例實例並將其注入到依賴類中。

請告訴你最好的選擇,爲什麼。

非常感謝,

回答

2

我真的很喜歡與IoC容器中的最後一個選項。這是它的力量 - 它負責你的對象的生命週期和依賴關係。

+0

謝謝;哪個IoC容器會推薦最佳性能? –

+1

看這裏 - http://stackoverflow.com/questions/21288/which-net-dependency-injection-frameworks-are-worth-looking-into –

0

我更喜歡IoC容器中的接口和普通類。您可以使用任何模擬框架創建實例和控制值,並將其發送給您測試的類/方法。否則,你將被迫使用像TypeMock或Moles這樣的隔離框架來模擬靜態方法中的值。

0

我知道我離題,但我認爲你不是在說讓這個類可測試,而是關於使其他類依賴於它可測試

當你測試這些類時,可能有一個QueryStringUtil的接口可能是有用的......?

但是,要嘗試更一般的答案,任何類型的單例都是測試責任(它是全局狀態的一種形式,就像全局變量,文件或數據庫一樣)。 這個問題的一般答案是使用注入依賴關係(我認爲這個名稱比「Inversion of Control」更精確,也更易於理解,實際上這意味着根據不同的人做出不同的事情)。 我對Asp.net並不熟悉,所以我不能告訴你要使用哪個庫,但找到一個庫就沒有問題。

依賴注入將使用單例,但不在您的代碼中,所以您可以測試您的代碼,就好像它不是Singleton一樣。

相關問題