2011-01-07 8 views
3

次のコードを単体テストする方法を理解しようとしています。最初はMoqを使ってすべてを模倣しようとしていましたが、封印されたクラスを模擬することはできません。私はインターフェイスを使用して実装(設定)への呼び出しを抽象化する必要があることを知っていますか?しかし、私はそれがすべて正しく動作するように見えることはできません。ユニットテストはどのように行うのですか.Netコード(リファクタリングが許可されています)

コードを変更することはできますが、魅力的な理由を提示できない限り、メソッドを静的に保つことをお勧めします。インターフェイスを追加したり、必要なシームを作成したりすることができます。また、GetConnStringByName()をリファクタリングして、ConnectionStringSettingsの代わりに関連する文字列を返すこともできます。

思考?

namespace Stackoverflow.Rocks 
{ 
    /// <summary> 
    /// Utility class for progmattically selecting values from the Web.config file. 
    /// </summary> 
    public class WebConfigStrings 
    { 
     //private static Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath); 

     /// <summary> 
     /// Retrieves the desired connection string value based upon the target name. 
     /// </summary> 
     /// <param name="connectionStringName">The target connection string referenced in the Web.Config</param> 
     /// <returns>The value specified in the Web.Config by your connectionStringName</returns> 
     public static ConnectionStringSettings GetConnStringByName(string connectionStringName) 
     { 
      Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath); 
      ConnectionStringSettings connString; 
      connString = rootWebConfig.ConnectionStrings.ConnectionStrings[connectionStringName]; 
      return connString; 
     } 

     /// <summary> 
     /// Retrieves the desired application string value based upon the target name. 
     /// </summary> 
     /// <param name="applicationStringName">The target application string referenced in the Web.Config</param> 
     /// <returns>The value specified in the Web.Config by your applicationStringName</returns> 
     public static string GetAppStringByName(string applicationStringName) 
     { 
      string appString = ""; 
      appString = ConfigurationManager.AppSettings[applicationStringName]; 
      return appString; 
     } 

    } 
} 
+2

+1名前空間。 –

答えて

0

必要なセクションを設定ファイルにダミー値で追加し、実際の値が正しいことを確認します。

+0

トマース - あなたのアイデアは大部分のために働いた。偽のweb.configを作成することはできませんが、App.configを作成することはできます。これにより、GetConnStringByName()の本体をリファクタリングして に戻す必要がありました。戻り値ConfigurationManager.ConnectionStrings [connectionStringName]; このコードはまだ私のプログラムで動作しています...そして今はテスト可能です。 – bulltorious

+0

それはあなたのために働くことを聞いて...それは行く限り、それを単純に保つ:) –

2

System.Web.Abstractionsで定義された新しいタイプを使用するようにクラスをリファクタリングします。このアセンブリは、asp.netが構築されているコア型(およびほとんど静的型または密封型)をラップするモック可能型を定義します。これにより、テスト中のモックで実際のランタイムタイプを切り替えることができます。

+0

それはなぜ必要ですか?コードの目的は、構成ファイルから値を取得することです。そのため、構成ファイルの予想される場所にダミー値を追加し、実際の値を読み取るのはなぜですか。何か不足していますか? 'HttpContext'のためですか? –

+0

Will - Tomasが技術的に答えている間、あなたの答えは私を大いに助けてくれるでしょう。あなたのためのアップボート:)。 – bulltorious

+1

@Tomas @bull問題は、あなたがコードを単体テストするのではなく、あなたのコードと標準のasp.netクラスコードをテストすることです。また、正しい、間違った、存在しない「ダミー」値をどのように追加しますか? 3つのアプリケーション設定ファイルが必要です。 aspを模倣できることによって。あなたが依存関係を持っているネットクラスは、あなたが返すものを制御することができます。これはかなり初期のユニットテスト手順です。このように考えてください。これが良いテストデザインではない場合、MicrosoftはなぜSystem.Web.Abstractionsを作成しましたか? – Will

0

最も簡単な方法は、設定ファイルにダミー値を追加することです。あなたのメソッドは静的なので、Moq/RhinoMocksでクラスをモックすることはできません。 TypeMockやTelerik JustMockを使用する必要がありますが、これにはコストがかかります。

クラスをモックする場合は、そのクラスをインスタンスにするか、ラッパークラスの設定をコンフィグレーションを処理する静的プロパティとして許可する必要があります。このようにして、テスト用のインターフェイスを使用し、設定ファイルを使用する実際のクラスを提供し、偽を静的プロパティに設定することによってテスト中にこれをスワップすることができます。

HTH。

0

誰もがここに興味を持っている場合は、私がやってんだよ、私はSystem.Webのために偽物のアセンブリを使用して、私が持っている私の使用して(ShimsContext.Create())ブロックでいる:

System.Web.Configuration.Fakes.ShimWebConfigurationManager.ConnectionStringsGet =() => new ConnectionStringSettingsCollection(){ new ConnectionStringSettings("name", "fake connection string")}; 

わかりませんそれがあなたが探しているものだが、それは言及する価値があると思った。

関連する問題