2012-05-30 63 views
1

我正面臨一個我不太明白的問題。嘲笑屬性(或吸氣劑)

我正在使用實體框架在C#/ ASP.net中開發應用程序。 我想對它做一些單元測試,因此我需要模擬其中一個對象,而且我似乎無法解決這個問題。

這裏是我想嘲笑類:如果沒有一個當前存在 http://pastebin.com/pMypAM7G

此類返回一個新DataSourceContainer,並返回現有否則(需要它,以避免多重執行緒)

下面是接口(僅目的是爲了讓嘲笑):http://pastebin.com/LRYVdA9j

這裏是我想測試fonction:http://pastebin.com/naVsV3FX

這裏是測試功能:http://pastebin.com/dY4ERzSJ

當我嘗試做測試時,由於沒有HttpContext(這是合乎邏輯的),我在getter中的Database類上得到一個錯誤。 我不明白的是吸氣劑應該被嘲笑。

我試圖在互聯網上查找它,但我無法弄清楚我做錯了什麼,所以如果有人可以幫我解決這個問題,我會非常感激。謝謝 !

回答

1

您還沒有正確執行代碼以支持單元測試 - 您正在方法中創建外部對象(Database)。此外,不使用IDatabase接口,但具體實施Database

public static User Connexion(String login, String MotDePasse) 
    { 
     Database bdd = new Database(); // this is inline, concrete implementation, this cannot be mocked 

     User us = bdd._Context.UserSet.FirstOrDefault(u => u.login == login); 
     if (us == null) 
      throw new Exception("Nom d'utilisateur erroné"); 
     if (us.password != MotDePasse) 
      throw new Exception("Mot de passe erroné"); 
     else 
      return us; 
    } 

你應該閱讀至少約Dependency Injection

這個簡短的例子可以幫助你理解問題在你的代碼

public static User Connexion(String login, String MotDePasse, IDatabase bdd) 
    { 
     User us = bdd._Context.UserSet.FirstOrDefault(u => u.login == login); 
     if (us == null) 
      throw new Exception("Nom d'utilisateur erroné"); 
     if (us.password != MotDePasse) 
      throw new Exception("Mot de passe erroné"); 
     else 
      return us; 
    } 

這一次,聯接鬆散地綁定到接口IDatabase,而不是它的實現。在運行時,你會提供new Database()作爲它的值,但在測試時,模擬實現。

+0

數據庫是具體的實現。在測試環境中,您應該有可能使用另一個實現,而不是數據庫。你現在得到的代碼不能在測試時使用替代實現。 – archil

+0

好吧,我誤解了一個嘲諷框架的目的。現在一切都很清楚。謝謝 ! – BPruvost

+0

@Tahedoz不客氣:) – archil

1

您必須將數據庫對象注入到測試方法中。或者最好將它注入到Userobjects的構造函數中,並且可能使它不是靜態的,因爲它現在看起來是靜態的。

使用提供的解決方案,您不使用模擬對象。您正在Connexion函數內創建具體對象。