2009-10-29 65 views
1

我想創建一個訪問我的數據層獲取字符串的HtmlHelper的單元測試。我已經看了很多關於這個的帖子,我可能錯過了一些東西。我遇到的問題是如何模擬對數據層的訪問?我通常通過構造函數執行依賴注入,但我不能在這裏,因爲html助手需要是靜態的。所以我通過一個屬性設置了注入,但是如何從我的單元測試中訪問它。對不起,如果這是顯而易見的,但它現在攪亂了我。單元測試HtmlHelper,需要訪問數據層

這裏是我 -

public static class StringResourceHelper 
{ 

    #region Private Members 

    private static IStringResourceService _service; 

    #endregion 

    #region Public Properties 

    private static IStringResourceService Service 
    { 
     get 
     { 
      if(_service==null) 
      { 
       _service = (IStringResourceService)Bootstrapper.Container.Resolve(typeof(IStringResourceService)); 
      } 

      return _service; 
     } 
    } 

    #endregion 

    #region Public Methods 

    public static string StringResource(this HtmlHelper helper, string label) 
    { 
     int languageCode; 

     if(helper.ViewData["LanguageCode"] == null || !Int32.TryParse(helper.ViewData["LanguageCode"].ToString(), out languageCode)) 
     { 
      languageCode = Constants.LanguageCodes.English; 
     } 

     return Service.GetString(label, languageCode); 
    } 

    #endregion 

} 

如何嘲笑Service.GetString電話嗎?

回答

0

首先,我會厭倦任何需要成員變量的靜態方法。對我來說,這是一個標誌,你有一個對象(可能是Singleton範圍)。所以我的第一個建議是將StringResourceHelper提升爲一個非靜態類,並像平常一樣使用DI。

如果你不能那麼你的DI框架的選擇是否支持靜態setter注入?如果我看到引導程序在DI框架之外的任何東西,那麼警告鈴聲就會響起,因爲它看起來好像是在使用DI框架作爲服務定位器。

如果你不能改變類是無靜電和您的DI框架不支持靜態setter注入那我就可以:

設置DI框架作爲向上設置返回測試的一部分嘲笑或添加setter到StringResourceHelper,以便可以控制它。

1

免責聲明我在Typemock

工作,如果你需要模擬/假的靜態方法和不改變你的代碼,你將需要使用Isolator

Isolate.WhenCalled(() => Service.GetString(string.empty, 0)).WillReturn(/*insert return value here*/); 

如果你想檢查傳遞給Service.GetString參數使用以下:

Isolate.Verify.WasCalledWithExactArguments(() => Service.GetString(/* use expected arguments*/); 
僞造方法是使用完成