我不確定通過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>
//這將是您的生產配置
<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>
您可以從http://www.springframework.net/
下載Spring.NET框架我修改了你提到的情況的代碼。這將導致具體的實現不會在測試中被調用,但仍然允許它是可測試的。 – Jonathan