c# – 如何对使用缓存的服务进行单元测试?

c# – 如何对使用缓存的服务进行单元测试?,第1张

概述我有一个服务层,它有一系列方法.这些方法实现了缓存,如下所示: string key = "GetCategories";if (CacheHandler.IsCachingEnabled() && !CacheHandler.ContainsKey(key)){ var categories = RequestHelper.MakeRequest("get_category_inde 我有一个服务层,它有一系列方法.这些方法实现了缓存,如下所示:

string key = "GetCategorIEs";if (CacheHandler.IsCachingEnabled() && !CacheHandler.ContainsKey(key)){    var categorIEs = RequestHelper.MakeRequest("get_category_index")["categorIEs"];    var converted = categorIEs.ToObject<List<category>>();    CacheHandler.InsertToCache(key,converted);    return converted;}return CacheHandler.GetCache(key) as List<category>;

现在,问题是我也想进行单元测试,如下所示:

[TestMethod]public voID GetCategorIEs(){    IContentService contentService = new ContentService();    var resp = contentService.GetCategorIEs();    Assert.IsNotNull(resp,"Should not be null");}

问题是,在单元测试期间,我的CacheHandler中的httpContext.Current是空的(显然).

解决这个问题的最简单方法是什么?

(请尽可能具体,因为我之前没有做过很多单元测试)

解决方法 这个尖叫 dependency injection.我看到的主要问题是你静态访问CacheHandler,所以在单元测试中,你:
a)在没有“测试”CacheHandler的情况下也无法测试服务
b)不能向服务提供任何其他CacheHandler,例如 mocked

如果在你的情况下这是可能的,我要么重构或至少包装CacheHandler,以便服务访问它的实例.在单元测试中,您可以为服务提供一个“假的”CacheHandler,它不会访问httpContext,也可以让您对测试本身进行非常精细的控制(例如,您可以测试项目缓存时会发生什么情况.当它不在两个绝对独立的单元测试中)

对于模拟部分,我认为最简单的方法是创建一个接口,然后使用一些专为测试而设计的自动插锁/代理生成框架,例如Rhino Mocks(但还有更多,只是碰巧我正在使用这个并且我非常很高兴:)).另一种方法(初学者更容易,但在实际开发中更麻烦)只是设计CacheHandler(或其包装器),以便您可以继承它并自己覆盖行为.

最后,对于注入本身,我发现了一个方便的“模式”,它利用了C#默认方法参数和标准构造函数注入.服务构造函数看起来像:

public ContentService(ICacheHandler cacheHandler = null){    // Suppose I have a fIEld of type ICacheHandler to store the handler    _cacheHandler = cacheHandler ?? new CacheHandler(...);}

所以在应用程序本身,我可以调用没有参数的构造函数(或者让框架构造服务,如果它是ASP.NET处理程序,WCF服务或其他类的类),并且在单元测试中,我可以提供任何实现上述的接口.

对于Rhino Mocks,它看起来像这样:

var mockCacheHandler = MockRepository.GenerateMock<ICacheHandler>();// Here I can mock/stub methods and propertIEs,set expectations etc...var sut = new ContentService(mockCacheHandler);
总结

以上是内存溢出为你收集整理的c# – 如何对使用缓存的服务进行单元测试?全部内容,希望文章能够帮你解决c# – 如何对使用缓存的服务进行单元测试?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1222566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存