2011-09-14 3 views
0

を使用して静的メソッドを呼び出す静的メソッド、コード自体私はImageRetrievalConfigurationを模倣し、それをThumbnailPresentationLogicクラスに渡す??ユニットテストタイトルとしてMOQ

internal static class ThumbnailPresentationLogic 
{ 
    public static string GetThumbnailUrl(List<Image> images) 
    { 
     return GetThumbnailUrl(images, 
      new Uri(ImageRetrievalConfiguration.GetConfig().ImageRepositoryName), 
      ImageRetrievalConfiguration.MiniDefaultImageFullUrl); 
    } 

    public static string GetThumbnailUrl(List<Image> images, Uri baseUri, 
     string defaultImageFullUrl) 
    { 
     if (images == null || images.FirstOrDefault() == null) 
     { 
      return defaultImageFullUrl; 
     } 

     Image latestImage = (from image in images 
          orderby image.CreatedDate descending 
          select image).First(); 

     Uri fullUrl; 

     return 
      Uri.TryCreate(baseUri, latestImage.FileName, out fullUrl) 
       ? fullUrl.AbsoluteUri 
       : defaultImageFullUrl; 
    } 
} 

が次にあなたがロジックをテストすることができますの一つが「ベースURI」と「デフォルトのURLを」取り、のいずれかがない - あなたは二つにメソッドを分割についてどのように

答えて

3

"3パラメータ"のオーバーロードがありますが、パブリックメソッドには本当にロジックが含まれていません。 100%のカバレッジは得られませんが、実際の論理がテストされます。

2

この静的クラスのメソッドへの呼び出しを傍受する必要があるため、Moqではこれを行うことはできません。まったく正常な模造フレームワークは完全に型でしか動作しないためです継承、自動コード生成などが含まれます。
しかし、静的メソッドの呼び出しを傍受するには、他のメカニズムが必要です。
.NET Framework静的クラスの呼び出しを傍受するには、Molesを使用できます。私はあなた自身の静的なクラスで動作するかどうかはわかりません。
TypeMock Isolatorはすべての静的クラスで動作しますが、空きではありません。

しかし、私は実際にあなたのアーキテクチャを再考すべきだと思います。

0

私はMoqを通して可能であるかどうかはわかりませんが、私はRhino Mocksを使用しています。私が通常このような状況で行うことは、Spring.NETを使用して、私がテストで呼び出した別のモックを、プロダクションのものと同じように提供することです。これは、特に、外部のWebサービス、データソース、またはあなたが提起した状況を使用する分野では、私にとって本当にうまく機能します。

次にユニットテストImageRetrievalConfigurationをseperatlyに設定し、期待通りに機能することを確認します。 MockImageRetrievalConfigurationは、テスト環境でどのように反応するかに基づいて結果を返すことができます。これは、あなたのテストの範囲を最大化します。

internal static class SpringApplicationContext 
    { 
     private static IApplicationContext applicationContext = null; 

     static SpringApplicationContext() 
     { 
      applicationContext = ContextRegistry.GetContext(); 
     } 

     public static IApplicationContext ApplicationContext 
     { 
      get { return applicationContext; } 
     } 
    } 

    public interface IImageRetrievalData 
    { 
     string ImageRepositoryName{get;set;} 
    }  

public interface IImageRetrievalConfiguration  
{ 
    IImageRetrievalData GetConfig(); 
} 

public class MockImageRetrievalConfiguration : IImageRetrievalConfiguration  
{  
    public IImageRetrievalData GetConfig() 
    { 
     //mock implementation 
    } 
} 

public class ImageRetrievalConfiguration : IImageRetrievalConfiguration  
{ 

    public IImageRetrievalData GetConfig() 
    { 
     //Concrete implementation 
    } 
} 



//your code 
internal static class ThumbnailPresentationLogic  
{   
      public static string GetThumbnailUrl(List<Image> images) 
      {    
      if (images == null || images.FirstOrDefault() == null)           
      {     
       return ImageRetrievalConfiguration.MiniDefaultImageFullUrl;    
      }    
      Image latestImage = (from image in images orderby image.CreatedDate descending select image).First();    
      Uri fullUrl; 

//Spring 
       IImageRetrievalConfiguration imageRetrievalConfig = (IImageRetrievalConfiguration)   SpringApplicationContext.ApplicationContext["ImageRetrievalConfiguration"]; 



      return Uri.TryCreate(new Uri(imageRetrievalConfig.GetConfig().ImageRepositoryName), latestImage.FileName, out fullUrl) ? fullUrl.AbsoluteUri : ImageRetrievalConfiguration.MiniDefaultImageFullUrl;   
      }  
} 

//これは、あなたのテストの設定になります

<spring> 
    <context> 
     <resource uri="config://spring/objects" /> 
    </context> 
    <objects xmlns="http://www.springframework.net"> 
     <object name="ImageRetrievalConfiguration" type="Tests.MockImageRetrievalConfiguration, Tests" singleton="false" /> 
    </objects> 
    </spring> 

//これは、あなたがhttp://www.springframework.net/

+0

からSpring.NETフレームワークをダウンロードすることができ

<spring> <context> <resource uri="config://spring/objects" /> </context> <objects xmlns="http://www.springframework.net"> <object name="ImageRetrievalConfiguration" type="Web.ImageRetrievalConfiguration , Web" singleton="false" /> </objects> </spring> 

本番構成になりますあなたが言及した状況のコードを修正しました。これにより、具体的な実装がテストで呼び出されず、テスト可能になります。 – Jonathan